为什么LISP的defun不需要在其参数之前加引号?

12

使用这个函数:

(defun sum-greater (x y z)
 (> (+ x y) z))
据我所知,在LISP中,列表中的第一个元素总是代表在其后面的原子/列表上执行的函数。那么为什么LISP不将(x y z)中的x视为要在yz上执行的函数呢?显然,这不是期望的行为,但它会是期望的行为。假设定义defun函数的函数某种方式覆盖了列表的标准LISP评估?如果是这样,请详细说明一下?
谢谢。

3
它还会延迟对其所有其他参数的评估:显然,当您评估defun表单时,也不希望评估(> ...) - Ken
好的观点,我应该从中意识到defun不仅仅是一个常规函数。 - Peter Le Bek
5个回答

8
据我所知,在Common Lisp中,至少defun是一个宏(HyperSpec),这意味着它可以为其参数定义任何评估策略。

1
啊,好的,那很有道理。我还没有看到我的LISP书中的宏章节。顺便说一下,我选择了这个答案,因为它最简洁,但还是谢谢大家。 - Peter Le Bek

6

defun是一种特殊的宏,因为它是一个宏,所以各种黑魔法都可能发生在幕后。Lisp HyperSpec (Common Lisp) 表示:“在宏展开时不会对任何参数进行求值”。


3
您的推断是正确的。Defun通常是一个特殊形式或宏。请参考特殊形式了解更多信息。

1
在Emacs Lisp中,但不是在Common Lisp中。在那里它是一个宏。 - Rainer Joswig
2
我在你的评论之前编辑了答案。但是你是完全正确的。 - The Archetypal Paul

3

2

defun不是一个函数,而是一个特殊形式(或者可以归结为特殊形式),因此它的求值机制与函数不同。类似的例子是if,其中一个参数甚至可以完全被丢弃而不进行任何求值!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接