为什么不起作用?
( ((lambda () (lambda (x) (funcall #'1+ x)))) 2)
; yields Compile-time error: illegal function call
我遇到了这样的情况,后来发现有funcall
解决方法,即
(funcall ((lambda () (lambda (x) (funcall #'1+ x)))) 2) ; => 3
我很困惑,因为似乎第一个应该可以工作,因为我实际上有一个正在调用的函数,而不仅仅是可能属于这两个名称空间(即(type-of ((lambda () #'1+))) ; => FUNCTION
)的符号。我认为这将是那种喜欢你怎么不需要到funcall
例如拉姆达如((lambda (x) x) :HI) ; => :HI
。我想念什么?
Common Lisp的语法要求,每次您想通过类型的compund形式调用函数时:
(f a1 a2 ... an)
列表的第一个元素f
必须是表示函数名称的符号,或者是表示lambda表达式的列表,即(请参见手册):
lambda表达式 Ñ。一个列表可以在一个地方而使用功能名在某些情况下表示一个功能通过直接描述其行为,而不是间接地通过参考一个的名称建立功能; 它的名称源于以下事实:它的第一个元素是符号lambda。
因此,这基本上意味着您不能将返回函数作为值的任何表达式作为第一个元素。在这种情况下,您必须使用funcall
。
因此,在您的第二个示例中,的第一个参数funcall
是((lambda () (lambda (x) (funcall #'1+ x))))
,这是正确的公然形式,其中列表的第一个元素是lambda表达式(lambda () (lambda (x) (funcall #'1+ x)))
(应用于空参数列表)。
相反,在第一个示例中,您将返回函数的表达式作为列表的第一个元素,因此必须使用funcall
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句