ディープバインディングまたはシャローバインディングは実装手法であり、プログラム内からは観察できません。プログラマーにとっての違いは、字句スコープと動的スコープのルールの違いですが、どちらも2つの手法のいずれかで実装できます(つまり、一方の概念はもう一方の概念とは関係ありません)。
深いまたは浅いとは、特定の外部スコープ変数のバインディングを保持するためのスタックフレームの選択を指します。ディープバインディングでは、変数のレコードを保持している正しいフレームが入力されるまで、アクセスされるフレームのチェーンがあります。浅いバインディングでは、すべてのバインディングが1つの浅い環境に存在します。「ルート変更」も参照してください(これは、字句スコープの浅いバインディング実装のコンテキストでのみ意味があります)。
あなたの特定の質問に対して、字句スコープのルールの下では、コードは動的(7 4 0)
に返されます- 、呼び出しはバインディングの動的スコープ内で行われるため(補足として、と同じです):(7 7 0)
((lambda(y) (list x y)) 0)
x=7
(cons x (list y))
(list x y)
x = 7
p = (lambda (y) (list x y)) ; x=4 is unused, in p=(make 4)
(cons 7 (p 0)) == (list 7 7 0) ; 'x' in this line and in lambda body for p
; both refer to same binding that is
; in effect, i.e. x=7
NB同じ用語(深い/浅いバインディング)が他の言語で使用されており、現在はまったく異なる意味を持っています(それらはそこでのスコープ規則と関係があります)。これは私が完全に理解することを気にしません。この答えはSchemeの文脈で与えられます。
参照:Baker、Henry G. Jr.、1977年によるLISP1.5の浅いバインディング。