Steele and Sussman
49
The Art of the Interpreter
(DEFINE (EVAL EXP ENV DENV)
(COND ((ATOM EXP)
(COND ((NUMBERP EXP) EXP)
(T (VALUE EXP ENV))))
((EQ (CAR EXP) 'QUOTE) (CADR EXP))
((EQ (CAR EXP) 'LAMBDA)
(LIST '&PROCEDURE (CADR EXP) (CADDR EXP) ENV))
((EQ (CAR EXP) 'COND)
(EVCOND (CDR EXP) ENV DENV))
((EQ (CAR EXP) 'DYNAMIC) (VALUE (CADR EXP) DENV))
(T (APPLY (EVAL (CAR EXP) ENV DENV)
(EVLIS (CDR EXP) ENV DENV)
DENV))))
(DEFINE (APPLY FUN ARGS DENV)
(COND ((PRIMOP FUN) (PRIMOP-APPLY FUN ARGS DENV))
((EQ (CAR FUN) '&PROCEDURE)
(APPLY-PROCEDURE (CADR FUN) ARGS '() '() '() '()
(CADDDR FUN) DENV (CADDR FUN)))
(T (ERROR))))
(DEFINE (APPLY-PROCEDURE VARS ARGS LVARS LARGS DVARS DARGS ENV DENV BODY)
(COND ((NULL VARS)
(COND ((NULL ARGS)
(EVAL BODY
(BIND LVARS LARGS ENV)
(BIND DVARS DARGS DENV)))
(T (ERROR))))
((NULL ARGS) (ERROR))
((ATOM (CAR VARS))
(APPLY-PROCEDURE (CDR VARS) (CDR ARGS)
(CONS (CAR VARS) LVARS) (CONS (CAR ARGS) LARGS)
DVARS DARGS
ENV DENV BODY))
((EQ (CAAR VARS) 'DYNAMIC)
(APPLY-PROCEDURE (CDR VARS) (CDR ARGS)
LVARS LARGS
(CONS (CAR VARS) DVARS) (CONS (CAR ARGS) DARGS)
ENV DENV BODY))
(T (ERROR))))
For EVCOND
and EVLIS
see Figure 2.
For VALUE
, BIND
, and LOOKUP
see Figure 3.
For LOOKUP1
see Figure 10.
Figure 15
Interpreter with Separate Lexical and Dynamic Variables