問題4.12

(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))