2012-09-27 16 views
6

मैं with-meta और ^ रीडर मैक्रो का उपयोग करने के बीच अंतर के रूप में उलझन में हूं।साथ-मेटा बनाम^{} - क्लोजर

संलग्न मेटाडाटा भी bazsymbol पाठक मैक्रो

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

कोई इस व्याख्या कर सकते हैं?

उत्तर

5

defspecial form है। भले ही with-meta एक प्रतीक देता है, क्लोजर कंपाइलर यह नहीं जानता (नहीं कर सकता)। यह एक समारोह देखता है।

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