Я недавно начал изучать clojure и читаю Радость Clojure , чтобы разобраться с ней.У меня есть вопрос, касающийся сегмента кода в главе (8) Macros , на стр. 166
(defmacro domain [name & body]
`{:tag :domain, ;`
:attrs {:name (str '~name)}, ;'
:content [~@body]})
Насколько я понимаю, body
представляет собой структуру в виде последовательности со всеми аргументамикроме первого.Если так, в третьей строке, почему мы склеиваем кавычки (~@
) и снова помещаем значения в вектор.Почему бы просто не сделать ~body
вместо [~@body]
?В чем разница?
Извините, но мне очень трудно уловить все макросы (из python).
Редактировать: Через некоторое времяэкспериментируя, я обнаружил, что это работает,
(defmacro domain2 [name & body]
`{:tag :domain, ;`
:attrs {:name (str '~name)}, ;'
:content '~body})
и наряду с результатами, полученными из ответа Джоста, я думаю, что я знаю, что здесь происходит.body
представляется в виде списка, и поэтому, если я не поставлю '
перед ~body
, clojure попытается оценить его.
user=> (domain "sh" 1 2 3)
{:content [1 2 3], :attrs {:name "sh"}, :tag :domain}
user=> (domain2 "sh" 1 2 3)
{:content (1 2 3), :attrs {:name "sh"}, :tag :domain}