定义匿名函数

Common Lisp 中的函数是第一类值。可以使用 lambda 创建匿名函数。例如,这里是 3 个参数的函数,然后我们使用 funcall 调用它们

CL-USER> (lambda (a b c) (+ a (* b c)))
#<FUNCTION (LAMBDA (A B C)) {10034F484B}>
CL-USER> (defvar *foo* (lambda (a b c) (+ a (* b c))))
*FOO*
CL-USER> (funcall *foo* 1 2 3)
7

匿名函数也可以直接使用。Common Lisp 为它提供了一种语法。

((lambda (a b c) (+ a (* b c)))    ; the lambda expression as the first
                                   ; element in a form
  1 2 3)                           ; followed by the arguments

匿名函数也可以存储为全局函数:

(let ((a-function (lambda (a b c) (+ a (* b c)))))      ; our anonymous function
  (setf (symbol-function 'some-function) a-function))   ; storing it

(some-function 1 2 3)                                   ; calling it with the name

引用的 lambda 表达式不是函数

请注意,引用的 lambda 表达式不是 Common Lisp 中的函数。这并不能正常工作:

(funcall '(lambda (x) x)
         42)

要将引用的 lambda 表达式转换为函数,请使用 coerceevalfuncall

CL-USER > (coerce '(lambda (x) x) 'function)
#<anonymous interpreted function 4060000A7C>

CL-USER > (eval '(lambda (x) x))
#<anonymous interpreted function 4060000B9C>

CL-USER > (compile nil '(lambda (x) x))
#<Function 17 4060000CCC>