2010-11-18 9 views
7

Ist es möglich, eine neue var mit Metadaten zu erstellen, ohne eine "intermediate" var zu durchlaufen?Clojure vars mit Metadaten

Mit anderen Worten, ich weiß, ich folgendes tun:

(def a-var 2) 
(def another-var (with-meta a-var {:foo :bar})) 

aber ist es eine Möglichkeit, another-var zu schaffen, ohne a-var zuerst zu schaffen?

Antwort

6

So:

user> (def ^{:foo :bar} another-var 2) 
#'user/another-var 
user> (clojure.pprint/pprint (meta #'another-var)) 
{:ns #<Namespace user>, 
:name another-var, 
:file "NO_SOURCE_FILE", 
:line 1, 
:foo :bar} 
nil 
6

Beachten Sie auch, dass (def another-var (with-meta a-var {:foo :bar})) anhängen nicht die Metadaten an den Var, sondern dem Wert. Und da in Ihrem Beispiel a-var eine Ganzzahl enthält, würde ich nicht erwarten, dass Ihr Beispiel überhaupt funktioniert, da Ganzzahlen keine Metadaten enthalten können.

user=> (def a-var 2) 
#'user/a-var 
user=> (def another-var (with-meta a-var {:foo :bar})) 
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IObj (NO_SOURCE_FILE:2) 
+0

Danke. Ich habe den Unterschied nicht bemerkt. – Ralph

+0

Gute Erklärung! – Daniel