問題4.12 – SICP(計算機プログラムの構造と解釈)その184

問題4.12

手続き set-variable-value!define-variable!lookup-variable-value を見ると、共通パターンになっている手続き scan を抽象化するとよい。
scan を 変数 var が見つかった場合は見つけた変数のリストを返し、見つからなかったばあいは '() を返すようにする。
各手続きにおいて scan の結果に応じて処理を行わせる。

(define (scan var vars vals)
  (cond ((null? vars) '())
        ((eq? var (car vars)) vals)
        (else
          (scan var (cdr vars) (cdr vals)))))

(define (lookup-variable-value var env)
  (define (env-loop env)
    (if (eq? env the-empty-environment)
        (error "Unbound variable" var)
        (let ((frame (first-frame env)))
             (let ((result-of-scan (scan var (frame-variables frame) (frame-values frame))))
                  (if (null? result-of-scan)
                      (env-loop (enclosing-environment env))
                      (car result-of-scan))))))
  (env-loop env))

(define (set-variable-value! var val env)
  (define (env-loop env)
    (if (eq? env the-empty-environment)
        (error "Unbound variable -- SET!" var)
        (let ((frame (first-frame env)))
             (let ((result-of-scan (scan var (frame-variables frame) (frame-values frame))))
                  (if (null? result-of-scan)
                      (env-loop (enclosing-environment env))
                      (set-car! result-of-scan val))))))
  (env-loop env))

(define (define-variable! var val env)
  (let ((frame (first-frame env)))
       (let ((result-of-scan (scan var (frame-variables frame) (frame-values frame))))
            (if (null? result-of-scan)
                (add-binding-to-frame! var val frame)
                (set-car! result-of-scan val)))))
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»