2010-11-18 42 views
7

是否有可能创建一个新的变量与元数据没有通过“中间”var?Clojure vars与元数据

换句话说,我知道我能做到以下几点:

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

,但有什么办法,而无需创建a-var首先创建another-var

回答

6

像这样:

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

还要注意,(def another-var (with-meta a-var {:foo :bar}))没有元数据附加到瓦尔,但对。因为在你的例子中,a-var拥有一个整数,所以我不希望你的例子能够工作,因为整数不能保存元数据。

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

谢谢。我没有意识到差异。 – Ralph 2010-11-18 11:48:32

+0

很好的解释! – Daniel 2013-10-25 20:24:31