2010-11-18 12 views
7

È possibile creare una nuova var con i metadati senza passare attraverso una variabile "intermedia"?Vlakure vars con metadati

In altre parole, so di poter effettuare le seguenti operazioni:

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

ma c'è un modo per creare another-var senza creare a-var prima?

risposta

6

Ti piace questa:

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

Si noti inoltre, che (def another-var (with-meta a-var {:foo :bar})) non allegare i metadati al Var, ma al valore. E poiché nel tuo esempio a-var contiene un intero, non mi aspetto che il tuo esempio funzioni affatto, poiché gli interi non possono contenere i metadati.

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

Grazie. Non ho capito la differenza. – Ralph

+0

Buona spiegazione! – Daniel