(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) (apply-env env Token)) (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) 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)))))