2009-11-18 142 views
26

我一直试图让我的头绕着浅层绑定和深度绑定,维基百科没有做好解释正确的工作。说我有下面的代码,将输出什么,如果语言使用动态作用域与动态范围界定 - 深度绑定vs浅绑定

一)深的结合

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) 
+0

这是Python的?你的问题语言是否是幽默的?请指定 – Shimmy 2009-12-27 01:50:02

回答

25

深度结合的过程作为参数

浅结合过去的时间结合环境的过程实际上是所谓

因此,对于深绑定动态范围设置的时间结合环境当添加到第二个 时,环境是x = 1,y = 3,x是全局x,因此它将4写入全局x,这是由write_integer拾取的。

浅结合刚刚穿越,直到它找到对应的名称,以便答案是1

+2

对于浅层绑定,如果我将“write_integer(y)”放在第二个过程(P()之前),我会得到3还是2?对于浅绑定,我是否可以不更改全局变量的值? – vvMINOvv 2012-02-14 00:30:37

+1

带浅绑定的动态范围将打印“5”。这是因为动态作用域使用来自其调用方法的绑定(可变值组合)。因此,具有浅绑定的动态范围将使用绑定'x = 2',而不像具有深绑定的动态范围,它将使用(如@ jjia6395所述)'x = 1'(从'add'传递到方法'second'作为参数)。 – 2014-10-09 00:47:25

+0

@AntoineDahan如果'second'动态地为恰好命名为'x'的新变量引入新绑定(如使用'x:integer:= 2'而不是'x:= 2')所以'add'(从'second'调用,而'second'处于活动状态)会动态地将'x'创建为5,但'write_integer(x)'引用全局'x'。所以,这个伪代码是误导性的。它应该在定义中使用“=”,比如'x:integer = 1'和在变异赋值中使用“:=”,如'x:= x + y'。 – 2015-12-29 12:44:36