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