web-dev-qa-db-ja.com

動的スコープ-深いバインディングと浅いバインディング

私は浅いバインディングと深いバインディングに頭を悩ませようとしてきましたが、ウィキペディアはそれを適切に説明するのにうまくいきません。次のコードがあるとしましょう。言語で動的スコープを使用すると、出力はどうなりますか。

a)深い結合

b)浅い結合?

x: integer := 1
y: integer := 2

procedure add
  x := x + y

procedure second(P:procedure)
  x:integer := 2
  P()

procedure first
  y:integer := 3
  second(add)

----main starts here---
first()
write_integer(x)
28
John Jiang

ディープバインディングは、プロシージャが引数として渡されるときに環境をバインドします

浅いバインディングは、プロシージャが実際に呼び出されたときに環境をバインドします

したがって、addが秒に渡されるときにディープバインディングを使用する動的スコープの場合、環境はx = 1、y = 3であり、xはグローバルxであるため、write_integerによって取得されたグローバルxに4を書き込みます。

浅いバインディングは、名前に対応する最も近い変数が見つかるまでトラバースするだけなので、答えは1になります。

28
John Jiang