JCLS icon indicating copy to clipboard operation
JCLS copied to clipboard

A (Common?)Lisp interpreter in JavaScript

                JCLS: Java-Common-Lisp-Script
                     (c) Mihai Bazon 2011
                 http://mihai.bazon.net/blog

    Any sufficiently complicated C or Fortran program contains an
    ad hoc, informally-specified, bug-ridden, slow implementation
    of half of Common Lisp.

                                         Greenspun's Tenth Rule

This is a toy Lisp interpreter in JavaScript. It follows the wisdom brought to us by prophets in SICP 4:1:7 to implement an analyze function that breaks the Lisp program into JavaScript closures. It's probably not usable for real programming, as the interpreter is recursive and could blow the stack quite easily.

Current features: (see tmp/test.lisp for some disorganized tests)

  • basic Lisp stuff: CONS, LIST, C[AD]+R, QUOTE, IF, LAMBDA etc.
  • CL-style packages (supports private symbols, etc.)
  • lexical and dynamic variables
  • FLET, LABELS, DEFUN, DEFMACRO, MACROEXPAND-1
  • CL-style lambda lists (&key, &optional, &body, DESTRUCTURING-BIND)
  • the quasiquote operator
  • CATCH, THROW, IGNORE-ERRORS, UNWIND-PROTECT
  • the ability to influence the reader (SET-MACRO-CHARACTER)

It's not remotely close to half of Common Lisp, as you can see, but maybe we can get closer. I'm planning to change the analyze function to continuation-passing style (as in SICP 4:3:3) and use a trampoline instead of doing tail calls, which should (if the resulting interpreter won't be unbearably slow) make it useful for real-world problems.