11

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)

この図で説明されています。

関数が適用されるたびに、シンボルと値の間のバインディングのセットを表す新しいフレームが作成されます( E1throughでラベル付けされます)。E4シンボルがフレームにバインドされていない場合、そのフレームを囲む環境は、その特定のシンボルのバインドについて照会されます。

この図の興味深い点は、でラベル付けされたすべてのフレームEがグローバル環境に含まれていることです。これは、関数がグローバル環境で定義されているためであると説明されていますが、この問題については詳しく説明されていません。

によって作成された各フレームは、プロシージャオブジェクトsquareによって示される環境であるため、グローバル環境を指していることに注意してください。square

代わりに、関数が呼び出された環境に含まれているフレーム、たとえば、に含まれているフレームが含まれている場合、E3それE2E1動的スコープの言語がどのように機能するかの有効なモデルでしょうか?また、Schemeは字句スコープであるため、ダイアグラム内のフレームが同じ「親」環境を持つ方法はありますか?

4

1 に答える 1

6

両方の質問に対する答えはイエスです。SICP のその章では、用語を実際に使用せずに字句範囲を説明しています。説明したように評価メカニズムを変更すると、動的スコープのモデルが作成されます。

于 2012-10-07T11:08:20.817 に答える