(load "/homes/palsberg/.www/cs565/F98/code/recscm.scm") (load "records") (load "tree") (define run (lambda () (record-case root (Goal (Expression Token) (eval-Expression Expression (empty-env))) (else (error 'run "Goal not found"))))) (define eval-Expression (lambda (Expression env) (record-case Expression (IntegerLiteral (Token) (string->number Token)) (TrueLiteral (Token) #t) (FalseLiteral (Token) #f) (PlusExpression (Token1 Token2 Expression1 Expression2 Token3) (+ (eval-Expression Expression1 env) (eval-Expression Expression2 env))) (IfExpression (Token1 Token2 Expression1 Expression2 Expression3 Token3) (if (eval-Expression Expression1 env) (eval-Expression Expression2 env) (eval-Expression Expression3 env))) (LetExpression (Token1 Token2 Token3 List Token4 Expression Token5) (let* ((ids (map Declaration->Identifier List)) (exps (map Declaration->Expression List)) (vals (map (lambda (Expression) (eval-Expression Expression env)) exps)) (new-env (extend-env-list ids vals env))) (eval-Expression Expression new-env))) (Identifier (Token) (deref-cell (apply-env env Token))) (Assignment (Token1 Token2 Identifier Expression Token3) (set-cell! (apply-env env (Identifier->Token Identifier)) (eval-Expression Expression env)) 'ok) (ProcedureExp (Token1 Token2 Token3 List Token4 Expression Token5) (make-closure List Expression env)) (Application (Token1 Expression List Token2) (let* ((clos (eval-Expression Expression env)) (ids (closure->formals clos)) (static-env (closure->env clos)) (vals (map (lambda (Expression) (eval-Expression Expression env)) List)) (new-env (extend-env-list ids vals static-env))) (eval-Expression (closure->body clos) new-env))) (else (error 'eval-Expression "Expression not found"))))) ;;; env (define empty-env (lambda () '())) (define apply-env (lambda (env id) (cadr (assoc id env)))) (define extend-env (lambda (id value env) (cons (list (Identifier->Token id) (make-cell value)) env))) (define extend-env-list (lambda (ids vals env) (if (null? ids) env (extend-env-list (cdr ids) (cdr vals) (extend-env (car ids) (car vals) env))))) ;;; Cells (define make-cell (lambda (value) (cons '*cell value))) (define deref-cell cdr) (define set-cell! set-cdr!) ;;; Closures (define-record closure (formals body env))