
``Horsey Horseless''
While I don't like the tone of my earlier post, No more "minimal early Lisps", pulleezz, I stand by its core message: implementing a "minimal early Lisp" may actually be bad for you.
Why? An analogy: if you want to learn how to build a car, learning to build a horse carriage doesn't seem right. And the difference between "LISP" and modern Lisps is similar to that between horse carriages and cars.
IMO, modern "mainstream" Lisp (Common Lisp, Scheme, Dylan, Goo, EuLisp, ISLISP) is the king of dynamic languages. All the others (PHP, Lua, Python, Ruby, ...) are merely variations on the theme.
Compared to Haskell, Lisp is a big hack. But it has its uses. And over the course of decades, Lispers have accumulated a wealth of tricks to cope with the hackish character inherent in Lisp.
So if you reimplement an early Lisp, you're missing out on a lot of stuff, just like Lisp's "successors" in the dynamic language area do. It's a shame, really. IMO, if you care about Lisp, you owe it to yourself to not only learn about "LISP", but also what happened in the 5 decades since.
And I also think you owe it to others. The world is already plagued enough by bad programming languages. If you want to put out a new one, even if it's meant just as a toy, by all means do us all a favor and study history first.
Here's a list of some of the stuff that I think every Lisp (re-)implementer should care about:
Bindings
Understand the difference between SETQ and DEFPARAMETER for global variables.
Understand PROGV and BOUNDP. Ponder their absence in Scheme.
Understand Scheme's LET, LET*, LETREC, and LETREC*. (Yeah, Schemers are funny people. But sometimes they do have a point.)
Understand the difference between Common Lisp's dynamic variables and Scheme's parameter objects (SRFI 39). Compare to EuLisp's DYNAMIC-LET.
Understand why Clozure CL offers DEFSTATIC.
Macros
Understand Scheme's expansion process.
Understand hygienic macros, preferably SRFI 72.
Understand why some Schemes use full phase separation, while others like to collapse meta-levels (also).
Understand negative meta-levels. (Once you do, please tell me how they work.)
Control Flow
Understand CATCH/THROW, TAGBODY/GO, and BLOCK/RETURN-FROM, and how they can be implemented in terms of each other.
Understand UNWIND-PROTECT vs DYNAMIC-WIND.
Understand the condition firewall.
Contrast Dylan's, Goo's, and CL's condition systems.
Conclusion
These are just some of the ingredients shared by "mainstream" modern Lisps. They have been developed and refined over the course of 5 decades by some of our best minds. You cannot understand modern Lisp, its history, or contribute to its glorious future without knowing about them.
If you want to learn how to build horse carriages, implement a "LISP". If you want to learn how to build cars, study the items in this list.
</soapbox>
(Update: See the HN discussion for some clarifications.)







