12

采取这个功能:

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

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

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

谢谢

4

5 回答 5

8

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

于 2010-11-16T15:30:11.263 回答
6

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

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

于 2010-11-16T15:30:37.753 回答
3

你的假设是正确的。Defun 通常是一种特殊的形式

于 2010-11-16T15:30:18.550 回答
3

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

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

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

  • 函数调用

  • 宏调用

  • 特殊形式

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

于 2010-11-16T15:31:08.520 回答
2

defun is not a function, but a special form (or boils down to one), and for these, evaluation mechanics are different. Similar examples would be if, where one of the arguments is even discarded entirely without being evaluated at all!

于 2010-11-16T15:31:36.833 回答