深层或浅层绑定是一种实现技术,无法从程序内部观察到。程序员的区别在于词法和动态范围规则之间,但两者都可以用这两种技术中的任何一种来实现(即一个概念与另一个无关)。
深或浅是指选择堆栈帧来保存给定的外部范围变量的绑定。在深度绑定中,需要访问一系列帧,直到输入正确的帧来保存变量的记录;在浅层绑定中,所有绑定都存在于一个浅层环境中。另请参阅“rerooting”(仅在词法范围的浅绑定实现的上下文中才有意义)。
对于您的具体问题,根据词法范围规则,您的代码将返回(7 4 0)
并且在动态-下(7 7 0)
,因为调用((lambda(y) (list x y)) 0)
是在x=7
绑定的动态范围内完成的(作为旁注,(cons x (list y))
与 相同(list x y)
):
x = 7
p = (lambda (y) (list x y)) ; x=4 is unused, in p=(make 4)
(cons 7 (p 0)) == (list 7 7 0) ; 'x' in this line and in lambda body for p
; both refer to same binding that is
; in effect, i.e. x=7
NB 相同的术语(深/浅绑定)现在在其他语言中使用完全不同的含义(它们确实与那里的范围规则有关),我不想完全理解。这个答案是在 Scheme 的上下文中给出的。
参考:LISP 1.5 中的浅绑定, Baker,Henry G. Jr.,1977 年。