It’s been a while since I’ve written, but now’s as good time as any to check in a bit. Chatting with one of my co-workers has got me looking once again at Lisp.
The conversation was along the importance of making measurable goals, and I had mentioned that every year is “the year I finally learn how to use Lisp,” because there’s no way to measure it. And of course, the question put to me was “why don’t you do that?” So…
I’m now reading David Touretzky’s COMMON LISP:A Gentle Introductionto Symbolic Computation. My measurable goal is to make my way through a bunch of Lisp books that have been collecting dust in the next few months. Because of course, I’ve got no shortage of time ;-)
After reading This Old Lisp, I’ve been poking a bit at Clozure CL, and it’s got a bunch of features to like - the FFI setup looks really slick, but again, this is coming from a general place of ignorance regarding the various Lisps.
I repeatedly hear that one big thing about Lisp is the “power of the REPL” and interactivity in the shell, but it surprises me most Lisps I’ve played (at least 4) with lack tab-completion. As a shell junkie, life without tab completion is frankly something I don’t even enjoy thinking about it. I remember a problem I had with Solaris botching tab completion over SSH sessions and it put me in a sour mood any time I had to shell in. This is where I think CLISP, despite looking like a moribund Sourceforge project, really shines: It’s got tab-completion and bracket matching in the REPL.
REPL ergonomics count for a lot with me. Sure, it’s like a person refusing to go into a fine restaurant because the front door doesn’t open properly, but you know what? First impressions matter. Here is a really sad comparison graph done for over 20 whole minutes of research (and yes, I added some Schemes as well, why the hell not). I’ve ordered by awesomeness of the front door metric.
|name||tab completion||bracket matching||ctrl-d exiting|
|Chez Scheme||Yes, and pretty, too||Totes||Yes, exits on one|
|CLISP||Hell yeah||Yeppers||Yes, exits on one - “Bye.”|
|Gambit Scheme||Yes, but iterates through list of potential commands||Yes indeedy||Yes, but not on “working” lines, exits on two|
|MIT Scheme||No.||No.||Yes, exits on one - “Moriturus te saluto.”|
|ECL||No.||No.||Yes, exits on one|
|Chicken Scheme||No.||No.||Yes, exits on one|
|Clozure CL||No.||No.||Yes, but on three|
|Scheme48||No.||No.||Yes, after 100 prompts. What the fresh hell is that about?|
Okay, so that’s probably not the most useful information I could give you about various Lisp and Scheme implementations. Still - it’s hard to grok how awesome the REPL is when some crappy “Hacker News flavor of the week language” REPL written in a few hours has those three things figured out right from the get-go.
Part of me wants to take an existing Lisp and shower it with love (I know Clozure CL is looking for committers). The sick part of me wants to write my own Lisp in a memory-safe language like Rust, because there’s nothing more deranged and Lisp-y like writing your own Lisp. Fortunately, as I’ve grown older there’s now stuff like “exercise” and “life balance” that seem to soak up my time, keeping me from the worst excesses of software development.