macros - defun - ¿Por qué es necesario el signo @ en esta definición de macro?
lisp syntax (2)
A continuación, cuando macro:
(defmacro when (condition &rest body)
`(if ,condition (progn ,@body)))
¿Por qué hay allí un signo?
Es muy fácil ver la diferencia haciendo 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 puede ver, el uso de @
colocará los elementos de la lista directamente dentro de la expansión. Sin que consigas en su lugar la lista colocada en la expansión.
El @
también se puede pensar en 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)