functions defun declarar como and macros lisp

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)