Elf M. Sternberg
db2e93b2f3
This is a big change. For chapter 5, I ripped out all line/column tracking and most error handling from the parser; it's now a plain ol' Lisp parser, and if it's not close to CL 22.1.1, it's a hell of a lot closer than it used to be. In doing so, I reduced the size of the parser by about 40 lines. TrackingReader takes every function in a Reader and puts that debugging information *back*. It turns out that all that information was prelude and postlude to the act of parsing; by wrapping each function in a decorator I was able to restore all that information, and I only had to get it right exactly *once*. In functional programming terms, this lifts: IO -> (atom | list) to: IO with tracking -> Node (atom | list) with tracking It's a totally free win without having to do much extra work. Now, this check-in isn't perfect. The tracking reader is still tossing on some things, and because I don't have a robust type system (it is Coffeescript, after all), I'm having to do the decorating and wrapping by hand. But I'm definitely on my way to understanding the issues, and having a grasp on functors and monoids. |
||
---|---|---|
bin | ||
chapter-lambda-1 | ||
chapter1 | ||
chapter3 | ||
chapter3g | ||
chapter4 | ||
chapter5 | ||
docs | ||
extras | ||
test | ||
.gitignore | ||
LICENSE | ||
Makefile | ||
README.md | ||
coffeelint.json | ||
package.json |
README.md
A Collection of Interpreters from Lisp In Small Pieces, written in Coffeescript
Purpose
I don't know Lisp, so I figured the correct place to start was to write my own interpreter. After buying five different textbooks (The Structure and Interpretation of Computer Programs, aka "The Wizard Book", Friedman's The Essentials of Programming Languages, Let over Lambda, On Lisp, and one more) I decided Christian Quinnec's Lisp In Small Pieces gave the clearest step-by-step introduction.
Since I didn't know Lisp, my task was to translate what Quiennec wrote in his book into a language I did know: Javascript. Well, Coffeescript, which is basically Javascript with a lot of the syntactical noise removed, which is why I liked it.
Usage
I don't know if you're going to get much out of it, but the reader (which I had to write by hand, seeing as I didn't have a native Lisp reader on hand in my Javascripty environment), and each interpreter has a fairly standard test case that demonstrates that each language does what it says it does: you can do math, set variables, name and create functions, and even do recursion.
Notes
chapter-lambda-1 is not from Lisp In Small Pieces. It is a primitive CPS interpreter built on top of the interpreter from LiSP Chapter 1, using techniques derived from a fairly facile reading of Lisperator's "Implement A Programming Language in Javascript." But it was fun.
LICENSE AND COPYRIGHT NOTICE: NO WARRANTY GRANTED OR IMPLIED
See the LICENSE file.