問題4.17 – SICP(計算機プログラムの構造と解釈)その189
2009年05月28日
問題4.17
フレームの生成を確認するために、手続き make-frame
にリーダマクロを付けて読み出してみる。
(define (make-frame variables values) #?=(cons variables values))
手続き scan-out-defines
を使って、定義を逐次的に解釈した場合と内部定義を掃き出した場合とを比較する。
定義を逐次的に解釈した場合
;;; M-Eval input: (define (f x) (define u 2) (+ u x)) ;;; M-Eval value: ok ;;; M-Eval input: (f 2) #?="./hoge.scm":508:(cons variables values) #?- ((x) 2) ;;; M-Eval value: 4
scan-out-defines
を使い内部定義を掃き出した場合
;;; M-Eval input: (define (f x) (define u 2) (+ u x)) ;;; M-Eval value: ok ;;; M-Eval input: (f 2) #?="./hoge.scm":508:(cons variables values) #?- ((x) 2) #?="./hoge.scm":508:(cons variables values) #?- ((u) *unassigned*) ;;; M-Eval value: 4
scan-out-defines
で内部意義を掃き出した場合 let
によって lambda
式を作る際にフレームが追加される。
環境構造が違っても正しくプログラムが実行されるのは、フレームを遡って変数を探すため。
環境図の作成と余計なフレームを構成しない実装方法についてはパス。
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542