采取此功能:
(defun sum-greater (x y z)
(> (+ x y) z))
我的理解是,在LISP中,列表中的第一个元素始终表示要在后续原子/列表上执行的函数。那么为什么LISP不会将x
中的(x y z)
视为要在y
和z
上执行的功能。显然,这不是理想的行为,但这将是预期的行为。
据推测,定义defun
的函数会以某种方式覆盖列表的标准LISP评估?如果是这样,你能详细说明一下吗?
由于
答案 0 :(得分:9)
Common Lisp中的IIRC至少defun
是一个宏(HyperSpec),这意味着它可以为其参数定义任何评估策略。
答案 1 :(得分:6)
defun
很特别,因为它是一个宏。而且由于宏可以依赖于实现,所以各种各样的黑魔法都可以在幕后发生。
Lisp HyperSpec(Common Lisp)says,我引用:“在宏扩展时没有评估任何参数”。
答案 2 :(得分:3)
你的推定是正确的。 Defun通常是special form或macro
答案 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)