为什么';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不仅仅是一个常规函数。。