SICP問題4.17
環境の図は省略。
定義を逐次的に解釈する場合
(lambda <vars> (define u <e1>) (define v <e2>) <e3>)
letを使い内部定義を掃き出した場合
(lambda <vars> (let ((u '*unassigned*) (v '*unassigned*)) (set! u <e1>) (set! v <e2>) <e3>))
これは更に
(lambda <vars> ((lambda (u v) (set! u <e1>) (set! u <e2>) <e3>) '*unassigned* '*unassigned*))
書き換えられる。
定義を逐次的に解釈する場合に比べて余計なフレームが存在するのはletからlambda式が作られる際にフレームが追加されるため。
プログラムの行動に違いがないのは、let内で新たな変数の定義を追加しておらず、変数の検索結果に違いが出ないため。
余計なフレームを構成せずに解釈形が内部定義の「同時」有効規則を実装する方法は余計なlambdaを入れなければ良いので、書き換えを
(lambda <vars> (define u '*unassigned) (define v '*unassigned) (set! u <e1>) (set! v <e2>) <e3>)
にすれば良い。