注意:*print-pretty*
适用NIL
于这些示例。
(defun where (x)
#'(lambda (item)
(> item x)))
在上面的函数where
中,您正在创建一个匿名函数,并将其作为闭包返回(函数加上变量绑定X
)。由于您将其作为值返回,因此您必须编写(FUNCTION (LAMBDA ...))
. #'(lambda ...)
是一个更短的符号,但结果相同 - 使用阅读器宏#'
:
CL-USER 74 > (read-from-string "#'(lambda (foo) (1+ foo))")
(FUNCTION (LAMBDA (FOO) (1+ FOO)))
你也可以写:
(defun where (x)
(lambda (item)
(> item x)))
在 Common Lisp 的定义过程中添加了它以便能够编写上述代码。它也与(function (lambda ...))
表格相同。在 Common LispLAMBDA
中是宏,它扩展到它:
CL-USER 75 > '(lambda (foo) (1+ foo))
(LAMBDA (FOO) (1+ FOO))
CL-USER 76 > (macroexpand '(lambda (foo) (1+ foo)))
(FUNCTION (LAMBDA (FOO) (1+ FOO)))
T
因此,LAMBDA
是一个宏,当评估者看到它时(lambda ...)
,它会将表单扩展为一个(function (lambda ...))
表单,然后对其进行评估。
FUNCTION
是一种特殊形式,当评估者看到它时,它会返回一个函数对象 - 在(function (lambda (foo) (1+ foo)))
它返回匿名函数作为对象的情况下:
CL-USER 77 > (function (lambda (foo) (1+ foo)))
#<anonymous interpreted function 406000761C>
所以你看到这(function (lambda ...))
是获取函数对象的真正的 s-expression 符号,并且#'(lambda ...)
(通过阅读器宏)或(lambda ...)
(通过宏)都是 Lisp 源代码中的较短符号。程序员使用长格式是不寻常的。大多数(99.999%)在源代码中使用较短的符号之一。
顺便说一句:如果评估器看到function
包含这样的函数名称(function sin)
,那么它会查找函数绑定并返回相应的函数对象:
CL-USER 78 > (function sin)
#<Function SIN 4110083C6C>