在Practical Common Lisp的第8章,宏:定义你自己,我们定义一个宏with-gensyms
如下:
(defmacro with-gensyms ((&rest names) &body body) `(let ,(loop for n in names collect `(,n (gensym))) ,@body))
这是什么目的(&rest names)
?如果我们用just替换它names
,效果似乎是一样的.在这两种情况下,我们都将符号列表传递给"gensym-ed".
区别:
(&rest names)
仅匹配列表.当有人使用其他东西时,错误来自宏扩展器:
在a上调用的调试器
SB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR
:解析参数时出错
DEFMACRO WITH-GENSYMS
:伪造子列表,
A
以满足lambda列表(&REST NAMES)
names
匹配任何东西 当有人使用没有列表的宏时,错误来自LOOP宏,需要一个列表:
在a上调用的调试器
TYPE-ERROR
:该值A
不是类型LIST
.
因此,您会得到更好,更早的错误.