Language agnostic 动态范围-深度绑定与浅绑定
我一直在试图了解浅绑定和深绑定,维基百科并没有很好地解释它。假设我有下面的代码,如果语言使用动态作用域和 a) 深装订 b) 浅装订Language agnostic 动态范围-深度绑定与浅绑定,language-agnostic,binding,scoping,dynamic-scope,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
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)
深度绑定在过程作为参数传递时绑定环境 浅绑定在实际调用过程时绑定环境 因此,当add传递到第二个 环境是x=1,y=3,x是全局x,因此它将4写入全局x,而全局x是由write_整数拾取的
浅绑定只需遍历,直到找到与名称对应的最近变量,因此答案为1。浅绑定应为5。 定义: a)在深度绑定中,我们处理add环境,其中x表示全局x,y表示y本地到第一个(最后执行的函数,其声明为y) x(全局)=x(全局)+y(局部):x=1+3=4 b) 在浅层绑定中,我们处理second环境,其中x表示x本地到second,y表示y本地到first(最后执行的函数,其声明为y) x(本地)=x(本地)+y(本地):x=2+3=5 但是:write_integer(x)输出等于1的全局x 最后 a) 四,
b) 1这是Python吗?你的问题是语言不可知论吗?请指定no,如jjia6395所述,它通过浅绑定输出
1
。这是因为对P()。调用write_integer(x)
打印未修改的全局x
。对于浅绑定,如果我将“write_integer(y)”放在过程秒内(P()之前),我会得到3还是2?同样对于浅绑定,我是否可以更改全局变量的值?浅绑定的动态范围将打印“5”。这是因为动态范围使用从中调用它的方法的绑定(变量值组合)。因此,浅绑定的动态范围将使用绑定x=2
,而深绑定的动态范围将使用(如@jjia6395所述)x=1
(从add
开始的绑定作为参数传递到方法second
).@AntoineDahan not ifsecond
动态地为一个新变量引入新的绑定,该变量名为x
(其使用x:integer:=2而不是x:=2
),因此add
(从second
调用,而second
处于活动状态)将动态创建的x
更改为5。但是write_integer(x)
引用全局x
。所以,这个伪代码是误导性的。它应该在定义中使用“=”,比如x:integer=1
,在变异赋值中,比如x:=x+y
。也就是说,我反对这种术语滥用——在LISP上下文中,它们首次出现,“深”和“浅”只是用于动态或词汇范围的实现技术,并且可以用于实现两者,因此,如果正确实现,它们与程序内部是无法区分的。这里所谓的“深度”绑定只是一个误解——它应该讨论“自由var解析时间”,并通过编写second(closed(add,(x,y)))
来明确它。在这两种情况下,它仍然是动态名称解析。你只需要2个冻结他们。所以冻结他们。明确地!