(eval-when (compile)
(define-syntax capture-env
(syntax-rules ()
+ ((_ (exp ...))
+ (let ((env (exp ...)))
+ (capture-env env)))
((_ env)
(if (null? env)
(current-module)
(define (eval exp env)
(memoized-expression-case exp
(('lexical-ref n)
- (let lp ((n n) (env env))
- (if (zero? n)
- (car env)
- (lp (1- n) (cdr env)))))
-
+ (list-ref env n))
+
(('call (f nargs . args))
(let ((proc (eval f env)))
(call eval proc nargs args env)))
(variable-ref
(if (variable? var-or-sym)
var-or-sym
- (let lp ((env env))
- (if (pair? env)
- (lp (cdr env))
- (memoize-variable-access! exp (capture-env env)))))))
+ (memoize-variable-access! exp
+ (capture-env (if (pair? env)
+ (cdr (last-pair env))
+ env))))))
(('if (test consequent . alternate))
(if (eval test env)
(('lexical-set! (n . x))
(let ((val (eval x env)))
- (let lp ((n n) (env env))
- (if (zero? n)
- (set-car! env val)
- (lp (1- n) (cdr env))))))
+ (list-set! env n val)))
(('call-with-values (producer . consumer))
(call-with-values (eval producer env)
(variable-set!
(if (variable? var-or-sym)
var-or-sym
- (let lp ((env env))
- (if (pair? env)
- (lp (cdr env))
- (memoize-variable-access! exp (capture-env env)))))
+ (memoize-variable-access! exp
+ (capture-env (if (pair? env)
+ (cdr (last-pair env))
+ env))))
(eval x env)))
(('dynwind (in exp . out))