(define (env-loop null-proc find-proc name var env)
(define (scan vars vals)
(cond ((null? vars) (null-proc env))
((eq? var (car vars)) (find-proc vals))
(else (scan (cdr vars) (cdr vals)))))
(if (eq? env the-empty-environment)
(error "Unbound variable -- " name " " var)
(let ((frame (first-frame env)))
(scan (frame-variables frame)
(frame-values frame)))))
(define (lookup-variable-value var env)
(define (null-proc env)
(env-loop null-proc find-proc "LOOKUP_VARIABLE_VALUE" var (enclosing-environment env)))
(define (find-proc vals) (car vals))
(env-loop null-proc find-proc "LOOKUP_VARIABLE_VALUE" var env))
(define (set-variable-value! var val env)
(define (null-proc env)
(env-loop null-proc find-proc "SET_VARIABLE_VALUE!" var (enclosing-environment env)))
(define (find-proc vals) (set-car! vals val))
(env-loop null-proc find-proc "SET_VARIABLE_VALUE!" var env))
(define (define-variable! var val env)
(define (null-proc env) (add-binding-to-frame! var val (first-frame env)))
(define (find-proc vals) (set-car! vals val))
(env-loop null-proc find-proc "DEFINE_VARIABLE!" var env))