带有元数据的Clojure变量

带有元数据的Clojure变量,clojure,metadata,Clojure,Metadata,是否可以使用元数据创建一个新的var,而不必经过“中间”var 换句话说,我知道我可以做到以下几点: (def a-var 2) (def another-var (with-meta a-var {:foo :bar})) 但是有没有办法创建另一个var而不先创建a-var?像这样: user> (def ^{:foo :bar} another-var 2) #'user/another-var user> (clojure.pprint/pprint (meta #'anot

是否可以使用元数据创建一个新的var,而不必经过“中间”var

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

(def a-var 2)
(def another-var (with-meta a-var {:foo :bar}))
但是有没有办法创建另一个var而不先创建a-var?

像这样:

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
user>(def^{:foo:bar}另一个变量2)
#'用户/另一个变量
用户>(clojure.pprint/pprint(meta#'另一个-var))
{:ns#,,
:命名另一个变量,
:文件“无源文件”,
:第1行,
:foo:bar}
无
还要注意,
(定义另一个var(使用meta a-var{:foo:bar}))
不会将元数据附加到var,而是附加到值。由于在您的示例
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)

谢谢我没有意识到区别。