2012-09-27 26 views
6

Tôi bị nhầm lẫn về sự khác biệt giữa việc sử dụng with-meta và macro trình đọc ^.with-meta vs^{} - Clojure

Đính kèm metadata quá bazsymbol bằng cách sử dụng đầu đọc vĩ mô

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

kéo nó ra

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

đính kèm sử dụng 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) 
tuy nhiên

...

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

tôi có thể gắn nó vào giá trị

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

nhưng nó không giống

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

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

ai đó có thể giải thích điều này?

Trả lời

5

defspecial form. Mặc dù with-meta trả về một biểu tượng, trình biên dịch Clojure không (không thể) biết điều đó. Nó thấy một hàm.

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