6

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

を使用して添付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 に答える