Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 动态范围-深度绑定与浅绑定_Language Agnostic_Binding_Scoping_Dynamic Scope - Fatal编程技术网

Language agnostic 动态范围-深度绑定与浅绑定

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

我一直在试图了解浅绑定和深绑定,维基百科并没有很好地解释它。假设我有下面的代码,如果语言使用动态作用域和

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)

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

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

因此,当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 if
second
动态地为一个新变量引入新的绑定,该变量名为
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个冻结他们。所以冻结他们。明确地!