为什么defun定义是不一样的(setq )?(why defun is not the sa

2019-07-30 02:56发布

我很困惑如何defun定义宏的工作方式,因为

(defun x () "hello")

将创建函数x,但符号x仍然是自由的。

如果我将结合一些拉姆达为x,则x将有一个价值,但它不会被解释为这样的形式,功能处理:

(x)

我认为这是应该defun函数定义在全球环境功能相关的事实,但我不知道这是什么意思完全相同。 为什么我不能遮盖了在目前的环境?

有没有什么办法来强制解释治疗符号作为功能,如果某一个lambda是必然的吗? 例如:

(setq y (lambda () "I want to be a named function"))
(y)

PS:我使用SBCL。

Answer 1:

Common Lisp的有功能和价值不同的命名空间。

你与函数命名空间定义函数DEFUNFLETLABELS和其他一些人。

如果你想获得一个函数对象作为其值,可以使用FUNCTION

(defun foo (x) (1+ x))

(function foo)   ->  #<the function foo>

或者更短:

#'foo    ->   #<the function foo>

如果你想调用的函数,那么你就写(foo 100)

如果你想调用的函数的值,那么你需要使用FUNCALLAPPLY

(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 。 因为我们有两个不同的命名空间,我们可以为两个不同的目的使用相同的名称。

还要注意,在本地功能的情况下,没有涉及符号 。 该命名空间不一定依赖于符号。 因此,对于局部变量通过符号名称的函数查找是不可能的。



Answer 2:

常见Lisp有对于每个符号的多个插槽,包括一个值型槽,和一个功能时隙。 当您使用语法(x) ,Common Lisp的查找功能槽结合的x 。 如果你要拨打的值绑定,使用funcallapply

见http://cl-cookbook.sourceforge.net/functions.html



文章来源: why defun is not the same as (setq )?