(load "8honors-helpers.ss") ;;; Interpreter (define apply-proc (lambda (rator rands) (variant-case rator (closure (formals body env) (eval-exp body (extend-env formals rands env))) (else (apply rator rands))))) (define eval-rands (lambda (exps env) (cond ((null? exps) '()) (else (cons (eval-exp (car exps) env) (eval-rands (cdr exps) env)))))) (define eval-exp (lambda (exp env) (variant-case exp (num (val) val) (varref (var) (cell-ref (apply-env env var))) (lambda (formals body) (make-closure formals body env)) (let (vars exps body) (eval-exp body (extend-env vars (eval-rands exps env) env))) (app (operator operands) (apply-proc (eval-exp operator env) (eval-rands operands env))) (if (test then else) (if (= (eval-exp test env) 0) (eval-exp else env) (eval-exp then env))) (begin (exps) (car (reverse (eval-rands exps env)))) (letrecproc (vars formalss exps body) (eval-exp (make-let vars (map (lambda (_) (make-num 0)) vars) (make-begin `(,@(map (lambda (var fs exp) (make-set! var (make-lambda fs exp))) vars formalss exps) ,body))) env)) (set! (var exp) (cell-set! (apply-env env var) (eval-exp exp env))) (else (error 'eval-exp "invalid syntax tree: ~s" exp)))))