(load "fin-fun.ss") (define eval-exp (lambda (exp) (cond ((lit? exp) (lit-datum exp)) ((varref? exp)(apply-env init-env (varref-var exp))) ((app? exp)(apply-proc (eval-exp (app-rator exp)) (map eval-exp (app-rands exp)))) (else (error 'eval-exp "Invalid abstract syntax:" exp))))) (define the-empty-env (create-empty-ff)) (define extend-env extend-ff*) (define apply-env (lambda (x y) (let ([look (apply-ff x y)]) (if (equal? look 'unknown-symbol) (error 'apply-env "undefined symbol " y) look)))) (define-record-type prim-proc (fields prim-op)) (define prim-op-names '(+ - *)) (define init-env (extend-env prim-op-names (map make-prim-proc prim-op-names) the-empty-env)) (define apply-prim-op (lambda (prim-op args) (case prim-op [(+) (+ (car args) (cadr args))] [(-) (- (car args) (cadr args))] [(*) (* (car args) (cadr args))] [else (error 'apply-prim-op "Invalid prim-op name: " prim-op)]))) (define apply-proc (lambda (proc args) (cond ((prim-proc? proc) (apply-prim-op (prim-proc-prim-op proc) args)) (else (error 'apply-proc "Invalid procedure: " proc)))))