如果我在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}>.
我相信答案必须非常简单,但我无法弄清楚。为什么会这样?
答案 0 :(得分:6)
函数调用中的第一个位置未正常计算。它可以是一个符号,也可以使用它的函数绑定,或者它可以是一个lambda表达式,并且将调用匿名函数。
你不能把其他表达式放在那里。所以你不能放一个返回函数的表达式。这就是为什么需要index.html
的原因,它是调用一个函数的方法,该函数的值来自于对表达式的评估。
funcall
不是lambda表达式或符号,它是一个返回函数的普通表达式。所以它不能在函数调用的开头使用。