2016-09-18 44 views
0

如果我呼吁在REPL以下拉姆达,一切如我所期待的工作原理:现在了解非法嵌套`lambda`呼叫

CL-USER> (funcall (lambda (x) x) 3) 
3 
CL-USER> ((lambda (x) x) 3) 
3 

,如果我窝在lambda到另一个lambda,我可以”不用再打电话了。

CL-USER> (funcall (funcall (lambda() (lambda (x) x))) 3) 
3 
CL-USER> (funcall ((lambda() (lambda (x) x))) 3) 
3 
CL-USER> (((lambda() (lambda (x) x))) 3) 
; in: ((LAMBDA() (LAMBDA (X) X))) 3 
;  (((LAMBDA() (LAMBDA (X) X))) 3) 
; 
; caught ERROR: 
; illegal function call 
; 
; compilation unit finished 
; caught 1 ERROR condition 
; Evaluation aborted on #<SB-INT:COMPILED-PROGRAM-ERROR {1009F09D13}>. 

我相信答案一定非常简单,但我一直没弄明白。为什么会发生?

+0

在Lisp中没有什么像* empty lambda *。 –

回答

6

函数调用中的第一个位置不被正常评估。它既可以是符号,也可以使用函数绑定,也可以是lambda表达式,并且将调用匿名函数。

您不能在其中放置其他表达式。所以你不能把表达式返回一个函数。这就是为什么需要funcall,这是调用一个函数的方式,其价值来自评估表达式。

((lambda() (lambda (x) x)))不是lambda表达式或符号,它是返回函数的普通表达式。所以它不能在函数调用的开始时使用。