«`» - это макровская квота. Всё, что лежит внутри «`», будет в прямом виде вставлено в место раскрытия макроса. Чтобы внутри «`» для конкретного s-exp'а опять переключиться в режим раскрытия, нужно использовать запятую ",". Если использовать форму ",@" на списке, то список будет раскрыт поэлементно (обычно так body раскрывают, как ,@body).
Во-первых не «@» а ",@". Во-вторых, как уже написал archimag, к макросам это не имеет никакого специального отношения. Что делает обычная кавычка (') понятно? Типа '(1 2 3)? Так вот, обратная кавычка (`) делает то же самое, за исключением того, что часть «закавыченного» sexp можно «раскавычить» при помощи запятой - `(x ,y z), т.е. вместо символа y в списке будет значение переменной, которую именует символ - (x 3 z). ,@ - аналогично запятой раскавычивает часть выражения, но еще и интерполирует его внутрь выражения если это список. Т.е. если y=(4 5), то
'(x y z) = (x y z)
`(x y z) = (x y z)
`(x ,y z) = (x (4 5) z)
`(x ,@y z) = (x 4 5 z)
Вам всё уже объяснили, и тут есть одна подстава. Константные части шаблона могут быть общими между разными его «воплощениями». Побочные эффекты могут наделать бед.
Например:
НО. При этом хвосты обоих списков _могут_ оказаться EQ между собой, т.е. это будет один и тот же общий хвост. Если над этими двумя возвратами выполнить какую-то деструктивную операцию, неожиданно может измениться и второй список.
>> НО. При этом хвосты обоих списков _могут_ оказаться EQ между собой, т.е. это будет один и тот же общий хвост.
И это тоже не определено стандартом, зависит от реализации => надо избегать таких вещей.
Например в ClozureCL `(,x 2 3) экспандится в (LIST* X '(2 3)),
при этом (eq '(2 3) '(2 3)) => nil, хотя с точки зрения оптимизации, могло бы быть true.
Единственное, что можно свободно setf-ить это формы, к которым применимо ",@" , но использовано ","