使用meta vs^{}-Clojure

使用meta vs^{}-Clojure,clojure,metadata,Clojure,Metadata,我搞不清楚将与meta一起使用与^读取器宏之间的区别 使用读卡器宏也附加元数据bazsymbol user=> (def ^{:foo "bar"} baz {:my "value"}) #'user/baz 拔出来 user=> (meta #'baz) {:foo "bar", :ns #<Namespace user>, :name baz, :line 1, :file "NO_SOURCE_PATH"} 然而 user=> (class (with-m

我搞不清楚将
与meta
一起使用与
^
读取器宏之间的区别

使用读卡器宏也附加元数据
baz
symbol

user=> (def ^{:foo "bar"} baz {:my "value"})
#'user/baz
拔出来

user=> (meta #'baz)
{:foo "bar", :ns #<Namespace user>, :name baz, :line 1, :file "NO_SOURCE_PATH"}
然而

user=> (class (with-meta 'baz2 {:foo "bar"}))
clojure.lang.Symbol
我可以将其附加到值

user=> (def baz2 (with-meta {:my "value"} {:foo "bar"})
#'user/baz2
但这不一样

user=> (meta baz2)
{:foo "bar"}

user=> (meta #'baz2)
{:ns #<Namespace user>, :name baz2, :line 1, :file "NO_SOURCE_PATH"}
user=>(元数据2)
{:foo“bar”}
user=>(meta#'baz2)
{:ns#,:name baz2,:行1,:文件“无源路径”}
有人能解释一下吗?

def
是一个例子。即使
with meta
返回一个符号,Clojure编译器也不知道这一点。它看到了一个函数

user=> (def (symbol blah) "blah")
CompilerException java.lang.RuntimeException: First argument to def must be a Symbol, compiling:(NO_SOURCE_PATH:1) 
user=> (def (symbol blah) "blah")
CompilerException java.lang.RuntimeException: First argument to def must be a Symbol, compiling:(NO_SOURCE_PATH:1)