理解非法嵌套的`lambda`调用

时间:2016-09-18 21:19:08

标签: lambda lisp common-lisp

如果我在REPL中调用以下lambda,一切都按照我的预期运行:

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

现在,如果我将lambda嵌套到另一个lambda中,我就不能在没有funcall的情况下调用它。

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}>.

我相信答案必须非常简单,但我无法弄清楚。为什么会这样?

1 个答案:

答案 0 :(得分:6)

函数调用中的第一个位置未正常计算。它可以是一个符号,也可以使用它的函数绑定,或者它可以是一个lambda表达式,并且将调用匿名函数。

你不能把其他表达式放在那里。所以你不能放一个返回函数的表达式。这就是为什么需要index.html的原因,它是调用一个函数的方法,该函数的值来自于对表达式的评估。

funcall不是lambda表达式或符号,它是一个返回函数的普通表达式。所以它不能在函数调用的开头使用。