with-meta vs ^ {} - Clojure

Ili*_*oly 6 metadata clojure

我对使用with-meta^阅读器宏之间的差异感到困惑.

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

user=> (def ^{:foo "bar"} baz {:my "value"})
#'user/baz
Run Code Online (Sandbox Code Playgroud)

拉出来

user=> (meta #'baz)
{:foo "bar", :ns #<Namespace user>, :name baz, :line 1, :file "NO_SOURCE_PATH"}
Run Code Online (Sandbox Code Playgroud)

附上使用 with-meta

user=> (def (with-meta 'baz2 {:foo "bar"}) {:my "value"})
CompilerException java.lang.RuntimeException: First argument to def must be a Symbol, compiling:(NO_SOURCE_PATH:1) 
Run Code Online (Sandbox Code Playgroud)

但是......

user=> (class (with-meta 'baz2 {:foo "bar"}))
clojure.lang.Symbol
Run Code Online (Sandbox Code Playgroud)

我可以将它附加到价值上

user=> (def baz2 (with-meta {:my "value"} {:foo "bar"})
#'user/baz2
Run Code Online (Sandbox Code Playgroud)

但它不一样

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

user=> (meta #'baz2)
{:ns #<Namespace user>, :name baz2, :line 1, :file "NO_SOURCE_PATH"}
Run Code Online (Sandbox Code Playgroud)

有人能解释一下吗?

noa*_*hlz 5

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) 
Run Code Online (Sandbox Code Playgroud)