9

Practical Common Lisp のChapter 8 , Macros: Defining Your Own では、次のようにマクロを定義with-gensymsします。

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

の目的は何(&rest names)ですか? だけに置き換えてもnames、効果は同じようです。どちらの場合も、「gensym-ed」にするシンボルのリストを渡します。

4

1 に答える 1

11

違い:

(&rest names)arglist 内では、((&rest names) &body body)リストのみに一致します。誰かが他の何かでマクロを使用している場合、エラーはマクロ エキスパンダーから発生します。

で呼び出されるデバッガSB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR:

への引数の解析中にエラーが発生しましたDEFMACRO WITH-GENSYMS:

Aラムダリストを満たす偽のサブリスト(&REST NAMES)

names何にでも合います。誰かがリストなしでマクロを使用している場合、リストが必要な LOOP マクロからエラーが発生します。

で呼び出されたデバッガーTYPE-ERROR: 値Aの型が ではありませんLIST

したがって、より良い、より早いエラーが発生します。

于 2015-12-30T10:42:58.233 に答える