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

理解非法嵌套的'lambda'调用,lambda,lisp,common-lisp,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 ()

如果我在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}>.
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)
; 
; 捕获错误:
;   非法函数调用
; 
; 编译单元已完成
;   捕获1个错误条件
; 对#的评估已中止。

我相信答案一定很简单,但我还没弄明白。为什么会发生这种情况?

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

你不能把其他的表达放在那里。所以你不能放一个返回函数的表达式。这就是为什么需要
funcall
,这是一种调用函数的方法,其值来自对表达式求值


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

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

你不能把其他的表达放在那里。所以你不能放一个返回函数的表达式。这就是为什么需要
funcall
,这是一种调用函数的方法,其值来自对表达式求值

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

Lisp中没有空lambda。Lisp中没有空lambda。