为什么 LISP defun 的参数参数之前不需要引号?

发布于 2024-10-02 22:47:30 字数 342 浏览 7 评论 0 原文

以这个函数为例:

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

据我了解,在 LISP 中,列表中的第一个元素始终代表要在后续原子/列表上执行的函数。那么为什么 LISP 不将 (xyz) 中的 x 视为对 yz 执行的函数>。显然,这不是理想的行为,但却是预期的行为。

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

谢谢

Take this function:

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

It's my understanding that in LISP the first element in a list always represents a function to be performed on the subsequent atoms/lists. So why doesn't LISP treat the x in (x y z) as a function to be performed on y and z. Clearly this would not be desirable behavior, but it would be the expected behavior.

Presumably the function that defines defun somehow overrides the standard LISP evaluation of a list? If so, could you detail this?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

月野兔 2024-10-09 22:47:30

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.

沉鱼一梦 2024-10-09 22:47:30

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".

玻璃人 2024-10-09 22:47:30

你的推测是正确的。 Defun 通常是一个 特殊形式

Your presumption is correct. Defun is commonly a special form or macro

他不在意 2024-10-09 22:47:30

您可以在这里下载 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.

满身野味 2024-10-09 22:47:30

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!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文