;;; ;;; See meval-orig.scm for the original code. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; CS 655 ;;; Mini-Scheme as described in class would report a ;;; binding error on x for the following code: ;;; (((lambda (x) (lambda (y) (+ x y))) 3) 4)) ;;; That's because apply did not remember the environment ;;; in which lambda (y) was evaluated. I have modified ;;; the code so that procedures remember their environment, ;;; and have eliminated the env parameter to apply. ;;; ;;; Michael Deighan ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (bind-variable var value env) (cons (cons (cons var value) (car env)) (cdr env))) (define (extend-environment env) (cons '() env)) (define (lookup-variable-value var env) (if (null? env) (error "No binding for " var) (if (null? (car env)) (lookup-variable-value var (cdr env)) (if (eq? var (car (car (car env)))) (cdr (car (car env))) (lookup-variable-value var (cons (cdr (car env)) (cdr env))))))) (define (apply proc operand) ;; changed (if (eq? (car proc) 'primitive) ((car (cdr proc)) operand) (eval (car (cdr (cdr proc))) (bind-variable (car (car (cdr proc))) operand (extend-environment (car (cdr (cdr (cdr proc))))))))) ;; changed (define (eval expr env) (if (or (number? expr) (and (list? expr) (eq? (car expr) 'primitive))) expr (if (symbol? expr) (lookup-variable-value expr env) (if (and (list? expr) (eq? (car expr) 'lambda)) (list 'procedure (car (cdr expr)) (car (cdr (cdr expr))) env) ;; changed (apply (eval (car expr) env) (eval (car (cdr expr)) env)))))) ;; changed