带元数据与^{}有何不同 - Clojure

7

我对使用with-meta^读取器宏之间的区别感到困惑。

使用读取器宏^将元数据附加到baz符号。

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) 

however ...

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

有人能解释一下这个吗?

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) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接