Digital Magpie

Ooh, ooh, look - shiny things!

On Lisp...

I’ve been playing a little with learning Lisp (not that I’ve much free time, but hey, what the hell). This example, taken from Dave Lamkins’ Successful Lisp), more than any other that I’ve seen so far, expresses the power of the language.

1
2
3
4
(defun open-bracket (stream char)
  `,(read-delimited-list #] stream t))
(set-macro-character #[#'open-bracket)
(set-macro-character #] (get-macro-character #)))

Here’s what’s happening: we’re redefining the syntax of the language dynamically! Normally, if I type [1 2 3] into a Lisp interpreter it will raise an error, something along the lines of variable [1 has no value, but after running that little code snippet I can now type [1 2 3] and it will create a three element list populated with the numbers 1, 2, and 3. Here’s the equivalent in a Java like syntax.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class OpenBracket implements JavaLanguageParser {
    static List list;
    public void nextToken(RuntimeEnv env, StreamTokenizer stok) {
        if (list == null)
            list = new ArrayList();
        int tok = stok.nextToken();
        if (tok == TT_WORD)
            list.add(stok.add(stok.sval));
        else if (tok == TT_NUMBER)
            list.add(new Double(stok.nval));
    }
}
class CloseBracket extends JavaLanguageParser {
    public void nextToken(RuntimeEnv env, StreamTokenizer stok) {
        if (OpenBracket.list ==null)
            throw new ParseException("mismatched brackets");
        env.pushObjectOntoStack(OpenBracket.list);
        OpenBracket.list.clear();
        OpenBracket.list == null;
    }
}
Lang.defineNewKeyword("[", new OpenBracket());
Lang.defineNewKeyworkd("]", new CloseBracket());

Then writing List foo = [1 2 3 bar] would yield a new ArrayList populated with 3 Double objects and a string. Even with my friendly psuedo-code it’s a lot more work, but to actually do this is impossible.

I assume that this is what folks like Paul Graham mean when they say things like ‘If you re writing a text-editor, you can turn Lisp into a language for writing text-editors. If you re writing a CAD program, you can turn Lisp into a language for writing CAD programs’ and it strikes me as an amazingly powerful concept. I think I really like this language.