Lisp in Small Pieces defines a complete interpreter for a scheme, capable of evaluating itself. This is just chapter 1!