我最近開始學習clojure和我正在閱讀Clojure的歡樂去掌握它。我有一個關於在宏章(8)的代碼段的一個問題,166Unquote拼接和在clojure宏向量中包裹
(defmacro domain [name & body]
`{:tag :domain, ;`
:attrs {:name (str '~name)}, ;'
:content [[email protected]]})
據我瞭解頁面上,body
是像第一個除外的所有參數結構的序列。如果是這樣,在第三行中,爲什麼我們不引用拼接([email protected]
)並將值重新放入向量中。爲什麼不只是做~body
而不是[[email protected]]
?有什麼不同?
我很抱歉,但我發現真的很難把握整個宏(來自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}
另外,它可以發佈這樣的書的一段代碼,就像這樣吧? – 2011-04-24 10:57:43
只是一個小事情要注意,它是unquote拼接不uniquote切片 – 2011-04-28 17:37:00
@Nicolas,更新謝謝 – 2011-04-29 01:18:21