(define (env-loop variable env emptyproc hitproc err)
(define (scan variables values)
(cond [(null? variables) (emptyproc env)]
[(eq? variable (car variables) (hitproc values))]
[else (scan (cdr variables) (cdr values))]))
(if (eq? env the-empty-enviroment) (error err var)
(let ((frame (first-frame env)))
(scan (frame-variables frame)
(frame-values frame)))))
(define (lookup-variable-value variable env)
(env-loop variable
env
(lambda (env)
(lookup-variable-value variable (enclosing-environment env)))
(lambda (values) (car values))
"Unbound variable"))
(define (set-variable-value! variable value env)
(env-loop variable
env
(lambda (env)
(set-variable-value! variable value (enclosing-environment env)))
(lambda (values) (set-car! values value))
"Unbound variable --SET!"))
(define (define-variable variable value env)
(env-loop variable
env
(lambda (env)
(add-binding-to-frame! variable value (first-frame env)))
(lambda (values) (set-car! values value))
'()))