为什么LISP defun在参数参数之前不需要引用?

时间:2010-11-16 15:16:17

标签: lisp common-lisp sbcl

采取此功能:

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

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

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

由于

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

你的推定是正确的。 Defun通常是special formmacro

答案 3 :(得分:3)

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

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

Lisp,特别是Common Lisp有几种Lisp形式:

  • 函数调用

  • 宏调用

  • 特殊表格

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

答案 4 :(得分:2)

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