Зачем нужен знак @ в этом определении макроса? - PullRequest
8 голосов
/ 14 апреля 2011

В следующих случаях при макросе:

(defmacro when (condition &rest body)
  `(if ,condition (progn ,@body)))

Почему там есть знак?

Ответы [ 2 ]

18 голосов
/ 14 апреля 2011

Очень легко увидеть разницу, проведя небольшой эксперимент

> (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)

Как вы можете видеть, использование ,@ поместит элементы списка прямо внутри расширения.Вместо этого вы получите список, размещенный в расширении.

2 голосов
/ 07 июля 2017

Можно также подумать о @ о деконструкции списка и добавлении его в список, как описано в Practical Common Lisp .

`(a ,@(list 1 2) c) 

является эквивалентом:

(append (list 'a) (list 1 2) (list 'c)) 

, который производит:

(a 1 2 c)
...