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>)

にすれば良い。