Based on Daniel Holden's book Build Your Own Lisp