为什么 LISP defun 的参数参数之前不需要引号?
以这个函数为例:
(defun sum-greater (x y z)
(> (+ x y) z))
据我了解,在 LISP 中,列表中的第一个元素始终代表要在后续原子/列表上执行的函数。那么为什么 LISP 不将 (xyz)
中的 x
视为对 y
和 z
执行的函数>。显然,这不是理想的行为,但却是预期的行为。
大概定义 defun
的函数会以某种方式覆盖列表的标准 LISP 计算?如果是这样,您能详细说明一下吗?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
Common Lisp 中的 IIRC 至少
defun
是一个宏 (HyperSpec),这意味着它可以为其参数定义任何评估策略。IIRC in Common Lisp at least
defun
is a macro (HyperSpec), meaning it may define any evaluation strategy whatsoever for its arguments.defun
很特殊,因为它是一个宏。由于宏可能依赖于实现,因此各种黑魔法都可能在幕后发生。Lisp HyperSpec (Common Lisp) 说,我引用:“没有参数在宏扩展时求值”。
defun
is special because it is a macro. And since macros can be implementation dependent, all sorts of black magic can happen beneath the hood.Lisp HyperSpec (Common Lisp) says, and I quote: "None of the arguments are evaluated at macro expansion time".
你的推测是正确的。 Defun 通常是一个 特殊形式 或 宏
Your presumption is correct. Defun is commonly a special form or macro
您可以在这里下载 Lisp 的基本介绍:
Common Lisp:符号计算的简要介绍,作者:大卫·S·图雷茨基。
Lisp,尤其是 Common Lisp 有几种 Lisp 形式:
函数调用
宏调用
特殊形式
DEFUN 是一个宏。因此,宏定义了哪些部分被评估,哪些部分不被评估。对于 ANSI Common Lisp,这是在标准中定义的并由 DEFUN 宏实现。
You can download here a basic introduction into Lisp:
Common Lisp: A Gentle Introduction to Symbolic Computation, by David S. Touretzky.
Lisp and especially Common Lisp has several Lisp forms:
function calls
macro calls
special forms
DEFUN is a macro. Thus the macro defines which parts are evaluated and which not. For ANSI Common Lisp this is defined in the standard and implemented by the DEFUN macro.
defun 不是一个函数,而是一种特殊形式(或归结为一种),对于这些函数,评估机制是不同的。类似的例子是 if,其中一个参数甚至被完全丢弃而根本没有被评估!
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!