2014-01-29 23 views
1

http://clojure.org/metadata元說:「符號和收藏支持元數據」Clojure的,對於一個符號

所以我儘量元數據設置爲一個符號:

=> a 
17 

=> (def aa ^a 'x) 

=> aa 
x 

=> (meta aa) 
nil 

如我所料它不工作。

=> (def aa ^a []) 

=> (meta aa) 
{:tag 17} 

這樣做。

這是文檔中的錯誤嗎?如果不是,你能解釋一下嗎?

更新回答Arthur Ulfeldt:所以我理解如下。當我寫

(def aa ^a 'x) 

讀者擴展成

(def aa ^a (quote x)) 

因此元數據是在列表(報價X),而不是在符號。在評估def宏時,這個列表得到了評估,給我們留下了x,並且元數據丟失了。

回答

3

如果不是使用quote讀者宏觀你寫出來的(quote x)表達式,然後將元數據附加到符號的報價中它的工作原理:

user> (def aa (quote ^unevaluated-symbol x)) 
#'user/aa 

user> (meta aa) 
{:tag unevaluated-symbol} 

值得一提的是,當你把符號與引用它永遠不會有機會被評估。如果您想要評估,您可以跳過整個報價並使用symbol函數生成符號:

user> (def aa (with-meta (symbol "x") {:foo a})) 
#'user/aa 
user> (meta aa) 
{:foo 17}