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
Apara 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 valorAno es del tipoLIST.
Así obtienes un error mejor y más temprano.