In Practical Common Lisps Kapitel 8 , definieren wir Makros: Eigene definieren ein Makro with-gensyms
wie folgt:
Was ist der Zweck von (&rest names)
? Wenn wir es durch names
ersetzen, scheint der Effekt der gleiche zu sein. In beiden Fällen übergeben wir eine Liste von Symbolen, die "gensymiert" sein sollen.
Der Unterschied:
(&rest names)
stimmt nur mit Listen überein. Wenn jemand das Makro mit etwas anderem verwendet, kommt der Fehler vom Makroexpander:
Debugger wurde in
aufgerufenSB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR
:Fehler beim Analysieren der Argumente für
DEFMACRO WITH-GENSYMS
:falsche Unterliste
zu erfüllenA
, um Lambda-Liste(&REST NAMES)
names
entspricht allem. Wenn jemand das Makro mit keiner Liste verwendet, kommt der Fehler vom LOOP-Makro, das eine Liste benötigt:
Debugger wird in
TYPE-ERROR
aufgerufen: Der WertA
hat nicht den TypLIST
.
Damit erhalten Sie einen besseren und früheren Fehler.
Tags und Links macros pattern-matching common-lisp practical-common-lisp