动态范围 - 深度绑定与浅层绑定

时间:2009-11-18 02:12:19

标签: language-agnostic binding scoping dynamic-scope

我一直试图让我的头围绕浅层绑定和深层绑定,维基百科并没有很好地解释它。假设我有以下代码,如果语言使用动态范围

,输出结果如何

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)

3 个答案:

答案 0 :(得分:28)

深度绑定在将过程作为参数传递时绑定环境

Shallow绑定在实际调用过程时绑定环境

因此,当将add传递给第二个时,使用深度绑定进行动态作用域 环境是x = 1,y = 3,x是全局x,所以它将4写入全局x,这是write_integer选择的那个。

浅层绑定只会遍历,直到找到与名称对应的最近变量,因此答案为1。

答案 1 :(得分:0)

a)在深度绑定中,我们处理add的环境,其中x表示全局x,y表示第一个(最后执行的函数,其声明为y)局部的y。

x(全局)= x(全局)+ y(局部):x = 1 + 3 = 4

b)在浅层绑定中,我们处理第二个环境,其中x表示第二个局部的x,y表示第一个局部的y(最后执行的函数,声明为y)

x(本地)= x(本地)+ y(本地):x = 2 + 3 = 5

BUT:write_integer(x)输出等于1的全局x

最后

a)4

b)1

答案 2 :(得分:-3)