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

問題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 式を作る際にフレームが追加される。
環境構造が違っても正しくプログラムが実行されるのは、フレームを遡って変数を探すため。

環境図の作成と余計なフレームを構成しない実装方法についてはパス。

計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»