;;; Interpreter for lambda calculus expressions ;;; It contains the NON-CPS version of primitive ;;; procedure applications. Translate it to CPS (load "chez-init.ss") (load "env.ss") (load "cont.ss") (load "parser.ss") (define (rl) (load "interpreter.ss")) (define eval-one-exp (lambda (exp) (top-level-eval (parse-expression exp)))) (define rep (lambda () (display ">> ") (let ([input (read)]) (if (equal? input '(exit)) (printf "Bye...~%") (let* ([parse-tree (parse-expression input)] [response (top-level-eval parse-tree)]) (pretty-print response) (rep)))))) (define top-level-eval (lambda (form) (eval-expression form (halt-cont) (extend-env '(a b) '(3 4) (empty-env))))) (define eval-expression (lambda (exp cont env) (cases expression exp [var-exp (id) (apply-cont cont (apply-env env id))] [lit-exp (val) (apply-cont cont val)] [if-exp (test-exp true-exp false-exp) (eval-expression test-exp (if-cont true-exp false-exp cont env) env)] [prim-app (primitive expression-list) (eval-expressions expression-list (apply-prim-cont primitive cont) env)]))) ;(define eval-expressions ; (lambda (exps env) ; (if (null? exps) ; '() ; (cons (eval-expression (car exps) env) ; (eval-expressions (cdr exps) env))))) ;(define eval-expressions ; (lambda (exps cont env) ; (if (null? exps) ; '() ; (eval-expression (car exps) ; (lambda (hole1) ; (eval-expressions (cdr exps) ; (lambda (hole2) ; (cons hole1 hole2)) ; env)) ; env)))) (define eval-expressions (lambda (exps cont env) (if (null? exps) (apply-cont cont '()) (eval-expression (car exps) (eval-cont (cdr exps) cont env) env)))) (define apply-primitive-procedure (lambda (name args) (case name [(+) (apply + args)])))