【发布时间】:2011-04-24 10:56:57
【问题描述】:
我最近开始学习 clojure,并且正在阅读 Clojure 的乐趣 以掌握它。我对 宏 第 (8) 章第 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})
连同我从 Joost 的回答中得到的结果,我想我知道这里发生了什么。 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}
【问题讨论】:
-
另外,像这样从书中发布一段代码可以吗?
-
只是一个需要注意的小事,它是 unquote-splicing 不是 unquote-slicing
-
@Nicolas,感谢更新