2010-11-18 12 views
7

Est-il possible de créer une nouvelle var avec des métadonnées sans passer par une variable "intermédiaire"?Variables Clojure avec métadonnées

En d'autres termes, je sais que je peux faire ce qui suit:

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

, mais est-il possible de créer another-var sans créer a-var d'abord?

Répondre

6

Comme ceci:

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

Notez également que (def another-var (with-meta a-var {:foo :bar})) n'attach pas les métadonnées du Var , mais à la valeur . Et puisque dans votre exemple a-var contient un nombre entier, je ne m'attendrais pas à ce que votre exemple fonctionne car les entiers ne peuvent pas contenir de métadonnées.

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

Merci. Je n'ai pas réalisé la différence. – Ralph

+0

Bonne explication! – Daniel