不明白这让let-lambda如何工作

时间:2018-12-14 19:46:12

标签: scheme

我回来了另一个计划问题。这是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])将阻止这种情况的发生。但这显然不是事实。我希望我对混乱的英语措辞有意义。

1 个答案:

答案 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以来已经很久了,我不知道我的说法是否正确。