注意:*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>