LAMBDA表达式
(lambda ...)
在某些情况下被视为lambda表达式,例如在function
表单中或作为函数调用的头部。Lambda表达式不会被评估。
(function
(lambda () 'foobar))
(
(lambda (foo) foo)
'bar
)
但这里的(lambda ...)
是一个宏形式而不是一个lambda表达式:
(funcall
(lambda (foo) foo)
'bar)
LAMBDA宏
LAMBDA是一个宏。它将(lambda ...)
扩展为(function (lambda ...))
,这相当于#'(lambda ...))
。
CL-USER > (macroexpand '(lambda (foo) foo))
(FUNCTION (LAMBDA (FOO) FOO))
这个宏(macro)只是为了让你少写/读一点而已。在Common Lisp的第一个版本(CLtL1)中,没有LAMBDA
宏。后来加入了这个宏,现在已经成为ANSI Common Lisp的一部分。
FUNCTION特殊运算符
FUNCTION是一个特殊运算符。它需要一个函数名或lambda表达式。因此,名称或lambda表达式不会被计算。事实上,lambda表达式根本无法被计算。在FUNCTION
内部,lambda表达式不是宏形式,因此不会再次展开。FUNCTION
的目的是返回由名称或lambda表达式表示的相应函数对象,并将其作为值返回。使用此特殊运算符,可以从全局函数和词法函数中访问函数对象。
在Common Lisp中,FUNCTION
运算符是必需的,因为它具有单独的命名空间用于值、函数和其他一些东西。它是所谓的或甚至,具有两个或多个命名空间。
函数形式中的lambda表达式
((lambda (foo) foo) 10)
由Common Lisp内置语法支持。请参见Lambda Forms。
令人困惑
这都是合乎逻辑的,但很令人困惑。不用担心,你并不孤单,但在实践中这并不是大问题。