En lo que sigue, cuando macro:¿Por qué es necesario el signo @ en esta definición de macro?
(defmacro when (condition &rest body)
`(if ,condition (progn ,@body)))
¿Por qué es el que hay en la muestra?
En lo que sigue, cuando macro:¿Por qué es necesario el signo @ en esta definición de macro?
(defmacro when (condition &rest body)
`(if ,condition (progn ,@body)))
¿Por qué es el que hay en la muestra?
Es muy fácil ver la diferencia al hacer un pequeño experimento
> (let ((x '(1 2 3 4))) `(this is an example ,x of expansion))
(THIS IS AN EXAMPLE (1 2 3 4) OF EXPANSION)
> (let ((x '(1 2 3 4))) `(this is an example ,@x of expansion))
(THIS IS AN EXAMPLE 1 2 3 4 OF EXPANSION)
Como se puede ver el uso de @
va a colocar los elementos de la lista directamente en el interior de la expansión. Sin que consigas en su lugar la lista colocada en la expansión.
También se puede pensar en el @
para deconstruir la lista y agregarla a la lista aparece como se describe en Practical Common Lisp.
`(a ,@(list 1 2) c)
es el equivalente de:
(append (list 'a) (list 1 2) (list 'c))
que produce:
(a 1 2 c)