9

在 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”的符号列表。

4

1 回答 1

11

区别:

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

在 a 上调​​用的调试器SB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR

解析参数时出错DEFMACRO WITH-GENSYMS

A满足 lambda-list 的虚假子列表(&REST NAMES)

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

在 a 上调​​用的调试器TYPE-ERROR:该值A不是类型LIST

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

于 2015-12-30T10:42:58.233 回答