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