【问题标题】:Why doesn't a LISP defun require a quote before its parameter argument?为什么 LISP defun 在其参数参数之前不需要引号?
【发布时间】:2011-05-10 21:15:57
【问题描述】:

取这个函数:

(defun sum-greater (x y z)
 (> (+ x y) z))

据我了解,在 LISP 中,列表中的第一个元素始终表示要在后续原子/列表上执行的函数。那么为什么 LISP 不将(x y z) 中的x 视为要在yz 上执行的函数。显然,这不是可取的行为,但会是预期的行为。

大概定义defun 的函数会以某种方式覆盖列表的标准LISP 评估?如果是这样,您能详细说明一下吗?

谢谢

【问题讨论】:

  • 它也会延迟对其所有其他参数的评估:您显然也不希望在评估 defun 表单时评估 (> ...)
  • 好点,我应该认识到 defun 不仅仅是一个普通的功能......

标签: lisp common-lisp sbcl


【解决方案1】:

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

【讨论】:

  • 嗯,有道理。我还没有达到我的 LISP 书的宏观章节。仅供参考 - 选择此答案是因为它最简洁,但谢谢大家。
【解决方案2】:

defun 很特别,因为它是一个宏。而且由于宏可以依赖于实现,所以各种黑魔法都可能在幕后发生。

Lisp HyperSpec (Common Lisp) says,我引用:“没有在宏扩展时评估任何参数”。

【讨论】:

    【解决方案3】:

    你的假设是正确的。 Defun 通常是special formmacro

    【讨论】:

    • 在 Emacs Lisp 中,但不是在 Common Lisp 中。那里有一个宏。
    • 我在您发表评论之前编辑了答案。但你说的很对。
    【解决方案4】:

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

    Common Lisp: A Gentle Introduction to Symbolic Computation, by David S. Touretzky.

    Lisp 尤其是 Common Lisp 有几种 Lisp 形式:

    • 函数调用

    • 宏调用

    • 特殊形式

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

    【讨论】:

      【解决方案5】:

      defun 不是函数,而是一种特殊形式(或归结为一种形式),对于这些,评估机制是不同的。类似的例子是如果,其中一个参数甚至被完全丢弃而不被评估!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 2021-05-17
        • 2012-10-01
        • 2013-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多