我很困惑如何defun定义宏的工作方式,因为
(defun x () "hello")
将创建函数x,但符号x仍然是自由的。
如果我将结合一些拉姆达为x,则x将有一个价值,但它不会被解释为这样的形式,功能处理:
(x)
我认为这是应该defun函数定义在全球环境功能相关的事实,但我不知道这是什么意思完全相同。 为什么我不能遮盖了在目前的环境?
有没有什么办法来强制解释治疗符号作为功能,如果某一个lambda是必然的吗? 例如:
(setq y (lambda () "I want to be a named function"))
(y)
PS:我使用SBCL。
Common Lisp的有功能和价值不同的命名空间。
你与函数命名空间定义函数DEFUN
, FLET
, LABELS
和其他一些人。
如果你想获得一个函数对象作为其值,可以使用FUNCTION
。
(defun foo (x) (1+ x))
(function foo) -> #<the function foo>
或者更短:
#'foo -> #<the function foo>
如果你想调用的函数,那么你就写(foo 100)
如果你想调用的函数的值,那么你需要使用FUNCALL
或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
。 因为我们有两个不同的命名空间,我们可以为两个不同的目的使用相同的名称。
还要注意,在本地功能的情况下,没有涉及符号 。 该命名空间不一定依赖于符号。 因此,对于局部变量通过符号名称的函数查找是不可能的。
常见Lisp有对于每个符号的多个插槽,包括一个值型槽,和一个功能时隙。 当您使用语法(x)
,Common Lisp的查找功能槽结合的x
。 如果你要拨打的值绑定,使用funcall
或apply
。
见http://cl-cookbook.sourceforge.net/functions.html