macros - sub - Diferencia entre `(& rest xs)` y `xs` en defmacro lista de argumentos formales
se pasaron 2 argumentos a una funcion que espera 1 (1)
En el Capítulo 8 de Practical Common Lisp, Macros: Defining Your Own, definimos una macro with-gensyms
siguiente manera:
(defmacro with-gensyms ((&rest names) &body body)
`(let ,(loop for n in names collect `(,n (gensym)))
,@body))
¿Cuál es el propósito de los (&rest names)
? Si lo reemplazamos con solo names
, el efecto parece ser el mismo. En ambos casos pasamos una lista de símbolos para ser "gensym-ed".
La diferencia:
(&rest names)
solo coincide con las listas. Cuando alguien está utilizando la macro con otra cosa, el error proviene del macroexpansor:
depurador invocado en un
SB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR
:error al analizar argumentos a
DEFMACRO WITH-GENSYMS
:sublista falsa
A
para satisfacer lambda-list(&REST NAMES)
names
coinciden con cualquier cosa. Cuando alguien está utilizando la macro sin una lista, el error proviene de la macro LOOP, que necesita una lista:
depuración invocada en un
TYPE-ERROR
: el valorA
no es del tipoLIST
.
Así obtienes un error mejor y más temprano.