さかもとのブログ

つらつらと

SICP演習問題4.12

;;exercise4.12
;;解答確認
(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!"))

;;frameはenvで作れるので,(let ((frame (first-frame env))) で始める必要はない!
;;(enclosing-environment env)と同様に(first-frame env)
(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))
            '()))