SICPのセクション3.2.2で、次のコードの実行
(define (square x)
(* x x))
(define (sum-of-squares x y)
(+ (square x) (square y)))
(define (f a)
(sum-of-squares (+ a 1) (* a 2)))
(f 5)
この図で説明されています。
関数が適用されるたびに、シンボルと値の間のバインディングのセットを表す新しいフレームが作成されます( E1
throughでラベル付けされます)。E4
シンボルがフレームにバインドされていない場合、そのフレームを囲む環境は、その特定のシンボルのバインドについて照会されます。
この図の興味深い点は、でラベル付けされたすべてのフレームE
がグローバル環境に含まれていることです。これは、関数がグローバル環境で定義されているためであると説明されていますが、この問題については詳しく説明されていません。
によって作成された各フレームは、プロシージャオブジェクト
square
によって示される環境であるため、グローバル環境を指していることに注意してください。square
代わりに、関数が呼び出された環境に含まれているフレーム、たとえば、に含まれているフレームが含まれている場合、E3
それE2
はE1
動的スコープの言語がどのように機能するかの有効なモデルでしょうか?また、Schemeは字句スコープであるため、ダイアグラム内のフレームが同じ「親」環境を持つ方法はありますか?