Common Lisp 对函数和值有不同的命名空间。
DEFUN
您可以在函数命名空间中使用、FLET
和LABELS
其他一些函数来定义函数。
如果要获取函数对象作为值,请使用FUNCTION
.
(defun foo (x) (1+ x))
(function foo) -> #<the function foo>
或更短:
#'foo -> #<the function foo>
如果要调用函数,则编写(foo 100)
.
如果要将函数作为值调用,则需要使用FUNCALL
or APPLY
:
(funcall #'foo 1)
您可以传递函数并调用它们:
(defun bar (f arg)
(funcall f arg arg))
(bar #'+ 2) -> 4
在 DEFUN 的情况下:
它不是(setf (symbol-value 'FOO) (lambda ...))
。
它更像(setf (symbol-function 'foo) (lambda ...))
。
请注意,这两个命名空间使您能够编写:
(defun foo (list)
(list list))
(foo '(1 2 3)) -> ((1 2 3))
内置函数LIST
和变量之间没有冲突LIST
。由于我们有两个不同的命名空间,我们可以将相同的名称用于两种不同的目的。
另请注意,在局部函数的情况下,不涉及符号。命名空间不一定与符号相关联。因此,对于局部变量,无法通过符号名称进行函数查找。