Skip to content

Latest commit

 

History

History
29 lines (19 loc) · 1.44 KB

README.md

File metadata and controls

29 lines (19 loc) · 1.44 KB

javalisp

A simple LISP interpreter implemented in Java.

I wrote this over the course of about three days more or less as an exercise, based off my memory of LISP from before Java existed. LISP is so simple a language that once you learn it, you can't really forget it, and the LISP interpreter, consisting primarily of two mutually recursive functions, eval and apply, is equally simple.

The parser is a simple recursive descent parser of less tha 200 lines of code, built on top of a Java StringTokenizer. It handles lists, including dot notation, symbols, integers, strings, and bits of syntactic sugar for things like '(A B C) as a shorthand for (QUOTE (A B C)), and similar shorthands for BACKQUOTE, COMMA and COMMA_AT (primarily used in defining LISP macros). So far the only reason the string type was included was for the LOAD function, which takes the name of a file as a string.

Using maven, the interactive interpreter can be run by running:

mvn compile

mvn exec:exec

Exit the interactive interpreter by evaluating NIL or ().

Macro definition is supported. There's an example of defining LET as a macro in the file let_macro.lisp.

Files can be loaded with the LOAD function. Example:

(LOAD "let_macro.lisp")

There's a trace facility, which prints arguments and return values for every call to eval or apply, as well as macro expansion. Tracing is started and stopped by evaluating (TRACE) and (UNTRACE).