理解非法嵌套的'lambda'调用
如果我在REPL中调用以下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 ()
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。