This is a blog about being a reinvigorated programmer. So it’s ironic that the most successful articles so far (at least in terms of number of hits) have been about The Good Old Days — Whatever happened to programming? and Programming the Commodore 64 being two examples.
One possible response to this would be to change the blog title to The Nostalgic Programmer, but I’m not going to do that — despite what you might think from what I’ve been writing, I am actually looking forwards more than backwards, and there are plenty of things I am excited about right now, including Ruby, refactoring, REST, Rails and even some things that don’t begin with R. Lisp, for example (although I guess I could have squeezed that into the R-list by substituting “recursion-based languages” or somesuch).
I’ve been promising since the second meaningful entry on this blog to learn Lisp, and it’s time to get started seriously. But before I do, I have an important choice to make:
Perhaps because of its very long history (it was first specified in 1958), Lisp has become horribly fragmented, and exists in far more mutually incompatible dialects than any other language. Not only that, but most of the dialects have multiple incompatible implementations, too, so you can’t just “learn Lisp” in the sense that you “learn Perl”. You have to pick one.
And that’s where I’m asking your help. I know that some of you out there have a lot of experience with Lisp, or rather, Lisps, and I’d really appreciate your input as I try to make this initial decision.
People generally say that the two principal dialects that you have to choose between are Common Lisp (big, kinda ugly, has comprehensive libraries) and Scheme (small, elegant, deficient in libraries) — and that the former is the best choice if you want to actually get stuff done but the latter is better for educational purposes. On that basis, my bias is towards a Scheme: I don’t particularly expect to use Lisp for any of my actual work (although if it turned out that I did, that would be a bonus), but I want to learn it primarily to become a better programmer.
There’s a third option as well, though: Emacs Lisp. GNU Emacs has been my primary editor since 1987, and I don’t see that changing any time soon. So knowing Emacs Lisp would be of more immediate practical value to me than either Common Lisp or Scheme. Does that seem like a reasonable path to take?
Also, supposing I choose Scheme: that still leaves the question of which implementation. Looking at the list of packages provided by the operating system of the computer that I’m writing this on (Ubuntu GNU/Linux 9.10), I see:
That’s a lot of choice. And on my other computer, running MacOS ports, I am offered even more:
Even if I narrow it down to the versions that are easily available on both platforms, that still leaves MIT Scheme, mzscheme, and scheme48. How do I choose between these?
Help me, Internet: you’re my only hope.
P.S. No thanks, I don’t want to learn Haskell instead
Nor Erlang, nor Clojure, nor OCaml, nor any of the other more whizzy and spiffy modern functional languages. I am sure they are all great, and have many important advantages over Boring Old Lisp; but at this stage, I want to start with foundations, and that means the language from 1958, not one of these fashionable arrivistes.
Their time will come.