实用 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 valueA
is not of typeLIST
.
因此您会得到更好、更早的错误。
关于macros - defmacro 形式参数列表中 `(&rest xs)` 和 `xs` 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34526235/