問題4.12 – SICP(計算機プログラムの構造と解釈)その184
2009年05月20日
問題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)))))
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542