定義匿名函式
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 表示式轉換為函式,請使用 coerce
,eval
或 funcall
:
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>