Clojure,符号的元数据

时间:2014-01-29 21:29:41

标签: clojure metadata

http://clojure.org/metadata说“符号和集合支持元数据”

所以我尝试将元数据设置为符号:

=> 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,元数据丢失了。

1 个答案:

答案 0 :(得分:4)

如果不是使用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}