让我们再看看这个...
((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3))
为了评估一个表格,我们依次评估它的每个部分。我们的表单中有三个元素。这个位于第一个(功能)位置:
(lambda (x y) (x y))
这是表单的第二个元素和函数的第一个参数:
(lambda (x) (* x x))
表单的最后一个元素,因此是函数的第二个参数。
(* 3 3)
在这种情况下,评估顺序无关紧要,所以让我们从左边开始。
(lambda (x y) (x y))
Lambda 创建了一个函数,因此它计算为一个接受两个参数 x 和 y 的函数,然后将 x 应用于 y(换句话说,使用单个参数 y 调用 x)。我们称之为call-1。
(lambda (x) (* x x))
这计算为一个接受单个参数并返回此参数的平方的函数。所以我们可以称之为square。
(* 3 3)
这显然评估为9。
好的,所以在第一次评估之后,我们有:
(call-1 square 9)
为了评估这一点,我们调用call-1并带有两个参数square和9。应用call-1给我们:
(square 9)
因为这就是call-1所做的 - 它用它的第二个参数调用它的第一个参数。现在, 9的平方是81,这是整个表达式的值。