<< Previous exercise (4.2) | Index | Next exercise (4.4) >>
a solution using association list (one-dimensional table)
(define (eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ;; eval-rules is an association list (1d table) of ;; 'expression type'-'evaluation rule' pairs. ;; expression type is a symbol ('quote, 'define, 'lambda etc.) ;; evaluation rule must be a procedure of two arguments, exp and env. ;; defined at the end of file. ((assq (car exp) eval-rules) => (lambda (type-rule-pair) ((cdr type-rule-pair) exp env))) ((application? exp) (apply (eval (operator exp) env) (list-of-values (operands exp) env))) (else (error "Unknown expression type -- EVAL" exp)))) (define eval-rules (list (cons 'quote (lambda (exp env) (text-of-quotation exp))) (cons 'set! eval-assignment) (cons 'define eval-definition) (cons 'if eval-if) (cons 'lambda (lambda (exp env) (make-procedure (lambda-parameters exp) (lambda-body exp) env))) (cons 'begin (lambda (exp env) (eval-sequence (begin-actions exp) env))) (cons 'cond (lambda (exp env) (eval (cond->if exp) env)))))
meteorgan