对于下面的代码,我无法理解绑定(x,y,z)是如何发生的。请查看代码,我将在下面更详细地解释我的问题:
(define (w x)
(lambda (y z)
(begin
(set! x (+ (* y x) z)) x)))
(define f1 (w 3))
(f1 4 2)
(f1 2 1)
输出为14,29。这些是x的值。
这意味着最初,x = 3,y = 4,z = 2。在第二次呼叫中,即(f1 2 1),x = 14,y = 2,z = 1。
我的怀疑:
首先如何发生绑定,为什么x = 3,y = 4,z = 2?如果它与函数中的lambda表达式有关,请详细说明它是如何工作的......我感觉这是我理解失败的地方..
接下来,为什么在第二次通话中保留x = 14的初始答案,即(f1 2 1)?
感谢您对此进行调查:)
答案 0 :(得分:4)
运行w
时,它会从内部lambda中创建一个闭包。因为x
来自该内部lambda之外,x
存储在该闭包内(在本例中为f1
)。
因此,f1
内部有一个代表x
的变量,它从3开始。当你运行f1
时,它会计算数学,然后设置自己的数学 x
为14。
道德是,lambda
不仅仅是代码;它的代码与关闭的变量相结合,例如x
。