Clojure变量与元数据

8

是否有可能在不经过“中间”变量的情况下创建具有元数据的新变量?

换句话说,我知道可以执行以下操作:

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

但是有没有办法在不先创建a-var的情况下创建another-var呢?

2个回答

7

就像这样:

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

7

请注意,(def another-var (with-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)

1
谢谢。我没有意识到这个区别。 - Ralph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接