为什么';LISP defun不需要在其参数参数前加引号吗?

为什么';LISP defun不需要在其参数参数前加引号吗?,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,采取以下措施: (defun sum-greater (x y z) (> (+ x y) z)) 我的理解是,在LISP中,列表中的第一个元素始终表示要在后续原子/列表上执行的函数。那么,为什么LISP不将(x y z)中的x视为在y和z上执行的函数呢。显然,这不是令人满意的行为,但这将是预期的行为 大概是定义defun的函数以某种方式覆盖了列表的标准LISP求值?如果是的话,你能详细说明一下吗 感谢Common Lisp中的IIRC至少defun是一个宏(),这意味着它可以为其参数

采取以下措施:

(defun sum-greater (x y z)
 (> (+ x y) z))
我的理解是,在LISP中,列表中的第一个元素始终表示要在后续原子/列表上执行的函数。那么,为什么LISP不将
(x y z)
中的
x
视为在
y
z
上执行的函数呢。显然,这不是令人满意的行为,但这将是预期的行为

大概是定义
defun
的函数以某种方式覆盖了列表的标准LISP求值?如果是的话,你能详细说明一下吗


感谢Common Lisp中的IIRC至少
defun
是一个宏(),这意味着它可以为其参数定义任何评估策略。

您的假设是正确的。Defun通常是一个宏,而Defun是一个特殊的宏。由于宏可能依赖于实现,所以各种各样的黑魔法都可能在幕后发生


Lisp HyperSpec(Common Lisp),我引用:“在宏展开时不会计算任何参数”。

您可以在这里下载Lisp的基本介绍:

Lisp,尤其是常见的Lisp有几种Lisp格式:

  • 函数调用

  • 宏调用

  • 特殊形式


是一个宏。因此,宏定义了哪些零件需要评估,哪些零件不需要评估。对于ANSI Common Lisp,这在标准中定义并由DEFUN宏实现。

DEFUN不是一个函数,而是一种特殊形式(或归结为一种),对于这些形式,求值机制是不同的。类似的例子可能是,其中一个参数甚至被完全丢弃而根本没有被评估

在Emacs Lisp中,但不在Common Lisp中。这是一个宏。我在你评论之前编辑了答案。但你说得很对。啊,对,这很有道理。我还没有读到我的LISP书的宏章节。仅供参考-选择此答案是因为它最简洁,但谢谢大家。它也会延迟对其所有其他参数的求值:显然,在求值
defun
表单时,您也不希望对
(>…)
求值!说得好,我应该认识到defun不仅仅是一个常规函数。。