Unterschied zwischen '(& rest xs)' und 'xs' in der formalen Argumentliste von defmacro

8

In Practical Common Lisps Kapitel 8 , definieren wir Makros: Eigene definieren ein Makro with-gensyms wie folgt:

%Vor%

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.

    
Tianxiang Xiong 30.12.2015, 09:04
quelle

1 Antwort

9

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 SB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR :

aufgerufen      

Fehler beim Analysieren der Argumente für DEFMACRO WITH-GENSYMS :

     

falsche Unterliste A , um Lambda-Liste (&REST NAMES)

zu erfüllen

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 Wert A hat nicht den Typ LIST .

Damit erhalten Sie einen besseren und früheren Fehler.

    
Rainer Joswig 30.12.2015, 10:42
quelle