Common Lisp 对函数和值有不同的命名空间。
DEFUN您可以在函数命名空间中使用、FLET和LABELS其他一些函数来定义函数。
如果要获取函数对象作为值,请使用FUNCTION.
(defun foo (x) (1+ x))
(function foo)   ->  #<the function foo>
或更短:
#'foo    ->   #<the function foo>
如果要调用函数,则编写(foo 100).
如果要将函数作为值调用,则需要使用FUNCALLor 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。由于我们有两个不同的命名空间,我们可以将相同的名称用于两种不同的目的。
另请注意,在局部函数的情况下,不涉及符号。命名空间不一定与符号相关联。因此,对于局部变量,无法通过符号名称进行函数查找。