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