gpt4 book ai didi

macros - defmacro 形式参数列表中 `(&rest xs)` 和 `xs` 之间的差异

转载 作者:行者123 更新时间:2023-12-02 09:22:44 24 4
gpt4 key购买 nike

实用 Common Lisp Chapter 8 ,宏:定义你自己的,我们定义一个宏with-gensyms如下:

(defmacro with-gensyms ((&rest names) &body body)
`(let ,(loop for n in names collect `(,n (gensym)))
,@body))

(&其余名称)的用途是什么?如果我们只用 names 替换它,效果似乎是一样的。在这两种情况下,我们都会传入要“gensym-ed”的符号列表。

最佳答案

区别:

arglist 内的

(&rest names) ((&rest names) &body body) 仅匹配列表。当有人将宏与其他东西一起使用时,错误来自宏扩展器:

debugger invoked on a SB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR:

error while parsing arguments to DEFMACRO WITH-GENSYMS:

bogus sublist A to satisfy lambda-list (&REST NAMES)

names 匹配任何内容。当有人使用没有列表的宏时,错误来自需要列表的 LOOP 宏:

debugger invoked on a TYPE-ERROR: The value A is not of type LIST.

因此您会得到更好、更早的错误。

关于macros - defmacro 形式参数列表中 `(&rest xs)` 和 `xs` 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34526235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com