题:
((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3))
这是中期的第一名,我把"81 9"他认为我忘了越过一个法律,所以我划掉81,然后他去了.无论如何,我不明白为什么它是81.
我理解为什么(lambda (x) (* x x)) (* 3 3) = 81
,但第一个lambda我不明白x和y值是什么,以及它的[body] (x y)
作用.
所以我希望有人可以向我解释为什么第一部分似乎没有做任何事情.
这需要一些缩进来澄清
((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3))
(lambda (x y) (x y))
; 调用x
与y
作为唯一的参数.
(lambda (x) (* x x))
; 评估其参数的平方.
(* 3 3)
; 评估为9
所以整个意思是:"用9作为参数调用square函数".
编辑:同样的事情可以写成
((lambda (x) (* x x)) (* 3 3))
我想这个练习的目的是强调评估方案表单如何涉及隐式函数应用程序.
让我们再看一遍......
((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).我们打电话给这个电话-1.
(lambda (x) (* x x))
这将求值为一个函数,该函数接受一个参数并返回该参数的平方.所以我们可以称这个方块.
(* 3 3)
这显然是评估为9.
好的,所以在第一次评估后我们有:
(call-1 square 9)
为了评估这一点,我们使用两个参数(square和9)调用call-1.应用call-1给我们:
(square 9)
因为这就是call-1所做的事情- 它用第二个参数调用它的第一个参数.现在,9的平方是81,这是整个表达式的值.