2010-11-18 21 views
7

¿Es posible crear una nueva var con metadatos sin pasar por una var "intermedia"?Clojure vars con metadatos

En otras palabras, sé que puedo hacer lo siguiente:

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

pero ¿hay alguna manera de crear another-var sin crear a-var primero?

Respuesta

6

De esta manera:

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

También tenga en cuenta, que no se fija (def another-var (with-meta a-var {:foo :bar})) los metadatos a la Var, pero con el valor . Y dado que en su ejemplo a-var contiene un entero, no esperaría que su ejemplo funcione en absoluto, ya que los enteros no pueden contener metadatos.

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

Gracias. No me di cuenta de la diferencia. – Ralph

+0

¡Buena explicación! – Daniel

Cuestiones relacionadas