問題4.13

(define (make-unbound-variable! var env)
  (define (env-loop env)
    (define (scan prev-vars vars prev-vals vals)
      (cond ((null? vars)
             (env-loop (enclosing-envrionment env)))
            ((eq? var (car vars))
             (set-cdr! prev-vars (cdr vars))
             (set-cdr! prev-vals (cdr vals)))
            (else (scan (cdr prev-vars) (cdr vars)
                        (cdr prev-vals) (cdr vals)))))
    (if (eq? env the-empty-environment)
        (error "Unbound variable. -- MAKE_UNBOUND_VARIABLE! " var)
        (let ((frame (first-frame env)))
          (if (eq? var (car (frame-variables frame)))
              (begin
                (set-car! frame (cdr (frame-variables frame)))
                (set-cdr! frame (cdr (frame-values frame))))
              (scan (frame-variables frame) (cdr (frame-variables frame))
                    (frame-values frame) (cdr (frame-values frame)))))))
  (env-loop env))

;; unboundされる変数名のコンスペア連結を外して消す。
;; frame の先頭にあった場合のみ、frameのcar部とcdr部を変更するので違う処理が必要。
;; listの中にある場合は、そのコンスを飛ばして下のコンスと接続するようにする。
;; 直近の環境に無ければ、上方の環境をたどりながら探していく。