LAMBDA 表达式
(lambda ...) 仅在某些地方被视为 lambda 表达式,例如 function 形式或作为函数调用的头部。不计算 Lambda 表达式。
(function ; special operator FUNCTION
(lambda () 'foobar)) ; <- this is a lambda expression
( ; a function call
(lambda (foo) foo) ; <- this is a lambda expression
'bar ; argument
)
但是这里(lambda ...)是一个宏形式而不是一个lambda表达式:
(funcall ; calling a function via funcall
(lambda (foo) foo) ; this is not a lambda expressions, but the macro lambda
; as all arguments to FUNCALL it will be
; macro expanded and evaluated
; it expands to (function (lambda (foo) foo))
'bar) ; argument
LAMBDA 宏
LAMBDA 是一个宏。它将(lambda ...) 扩展为(function (lambda ...)),相当于#'(lambda ...))。
CL-USER > (macroexpand '(lambda (foo) foo))
(FUNCTION (LAMBDA (FOO) FOO))
宏为您节省了一些写作/阅读时间,仅此而已。在 Common Lisp (CLtL1) 的第一个版本中,没有 LAMBDA 宏。它是后来添加的,现在是 ANSI Common Lisp 的一部分,
FUNCTION 特殊运算符
FUNCTION 是一个特殊的运算符。它需要一个函数名或 lambda 表达式。因此,不会评估名称或 lambda 表达式。事实上 lambda 表达式 根本无法计算。在FUNCTION 内部,lambda 表达式 不是 宏形式,因此将不会 再次展开。 FUNCTION 的目的是返回由名称或 lambda 表达式 表示的相应函数对象。它将函数对象作为值返回。有了这个特殊的操作符,我们可以从全局函数和词法函数中访问函数对象。
FUNCTION 运算符在 Common Lisp 中是必需的,因为它为值、函数和其他一些东西提供了单独的命名空间。它就像一个所谓的 Lisp-2 甚至 Lisp-n,有两个或多个命名空间。
函数形式中函数位置的 Lambda 表达式
((lambda (foo) foo) 10) 由 Common Lisp 的内置语法支持。见Lambda Forms。
令人困惑
这都是合乎逻辑的,但令人困惑。不要担心你并不孤单,但实际上这没什么大不了的。