我回来了另一个计划问题。这是Dybvig的书方案编程语言中的一个示例,我了解发生了什么:
(let ([x 'a])
(let ([f (lambda (y) (list x y))])
(f 'b))) --> (a b)
但是他立即提出了一个我听不懂的修改示例:
(let ([f (let ([x 'sam])
(lambda (y z) (list x y z)))])
(f 'i 'am)) --> (sam i am)
在通话(f 'i 'am)
中,我不知道发生了什么,这就是我的困惑。我看不到如何用两个参数定义f。如果缺少更好的术语,lambda参数如何冒泡到f?我认为代码let ([x 'sam])
将阻止这种情况的发生。但这显然不是事实。我希望我对混乱的英语措辞有意义。
答案 0 :(得分:2)
f
被定义为(lambda (y z) (list x y z))
,其中x
被定义为'sam
。
让我们分解一下。
(let ([x 'sam])
(lambda (y z) (list x y z)))
这将计算为lambda(我会称之为that_lambda
,因为我可以)。
(let ([f that_lambda])
(f 'i 'am)) --> (sam i am)
这等于(that_lambda 'i 'am)
。
由于that_lambda
是在范围{其中x
为'sam
的范围中定义的,因此x
中使用的that_lambda
是指'sam
。 / p>
*自从完成Lisp以来已经很久了,我不知道我的说法是否正确。