6

我对 usingwith-meta^reader 宏之间的区别感到困惑。

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"}

附加使用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) 

然而 ...

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"}

有人可以解释一下吗?

4

1 回答 1

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) 
于 2012-09-27T18:56:37.497 回答