2016-09-18 76 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表達式或符號,它是返回函數的普通表達式。所以它不能在函數調用的開始時使用。