Clojure перемен с метаданными - PullRequest
7 голосов
/ 18 ноября 2010

Можно ли создать новую переменную с метаданными без прохождения "промежуточной" переменной?

Другими словами, я знаю, что могу сделать следующее:

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

, ноЕсть ли способ создать another-var без создания a-var сначала?

Ответы [ 2 ]

6 голосов
/ 18 ноября 2010

Также обратите внимание, что (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)
6 голосов
/ 18 ноября 2010

Как это:

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
...