I'm reading Land of Lisp and the guy uses CLISP (and CLISP specific extensions), so I'm using it for now. But I've heard good things about SBCL and others. Which one would you recommend? Should I stick with CLISP?
Now, where's the interpreter? sb!eval:eval-in-native-environment is SBCL's interpreter, not the other case, you were looking at when (eq *evaluator-mode* :compile), not the other possibility.
Now look at the sb-eval package contained in full-eval.lisp:
;;;; An interpreting EVAL
;;;; This software is part of the SBCL system. See the README file for
;;;; more information.
;;;;
;;;; This software is derived from the CMU CL system, which was
;;;; written at Carnegie Mellon University and released into the
;;;; public domain. The software is in the public domain and is
;;;; provided with absolutely no warranty. See the COPYING and CREDITS
;;;; files for more information.
And there you will see code handling each special form in full:
(defun %eval (exp env)
(incf *eval-calls*)
(if *eval-verbose*
;; Dynamically binding *EVAL-LEVEL* will prevent tail call
;; optimization. So only do it when its value will be used for
;; printing debug output.
(let ((*eval-level* (1+ *eval-level*)))
(let ((*print-circle* t))
(format t "~&~vA~S~%" *eval-level* "" `(%eval ,exp)))
(%%eval exp env))
(%%eval exp env)))
(defun %apply (fun args)
(etypecase fun
(interpreted-function (interpreted-apply fun args))
(function (apply fun args))
(symbol (apply fun args))))