una sub que premisas pasaron pasar parametros parametro otra macro llamar funcion espera ejemplos desde conclusiones con argumentos macros pattern-matching common-lisp practical-common-lisp

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 valor A no es del tipo LIST .

Así obtienes un error mejor y más temprano.