C311 Fall 96. Assignment 9 (solution)
The solution to this assignment involves only a few changes in
eval-exp. The whole new intepreter is in
a9.ss and the changes are marked here with
strong. As you can see,
a9start.ss was only 4 lines away from
the solution.
(define eval-exp
(lambda (exp env)
(if (variable? exp)
(if (memq exp *prim-op-names*)
(apply-env prim-env exp)
(denoted->expressed (apply-env env exp)))
(record-case exp
(quote (datum) datum)
(* (exp) (denoted->expressed (eval-exp exp env)))
(& (var) (apply-env env var))
(lambda (formals . body) (make-closure formals body env))
(set! (var exp)
(let ([exp-value (eval-exp exp env)])
(if (var-indirect? var)
(cell-set! (eval-exp (addr->var var) env) exp-value)
(cell-set! (denoted->L-value (apply-env env var)) exp-value))))
(local (decls body)
(let ((vars (map decl->var decls))
(exps (map decl->exp decls)))
(eval-exp body
(extend-env vars
(map (lambda (exp) (expressed->denoted (eval-exp exp env)))
exps)
env))))
(else
(let ((proc (eval-exp (app->rator exp) env))
(args (eval-rands (app->rands exp) env)))
(apply-proc proc args)))))))
Gustavo Gomez /
ggomezes@cs.indiana.edu
Last modified: Sun Dec 1 18:17:01 EST