Вроде так:
java -cp clojure.jar clojure.main
Clojure 1.2.0
user=> (defn f [x] x)
#'user/f
user=> (meta f)
{:ns #<Namespace user>, :name f}
user=> (defn f [x] x)
#'user/f
user=> (meta f)
{:ns #<Namespace user>, :name f, :file "NO_SOURCE_PATH", :line 1, :arglists ([x])}
user=>
Почему вызов meta
не возвращает одно и то же значение каждый раз?
ОБНОВЛЕНИЕ: сыграв еще немного, я смог получить ответ на свой ближайший вопрос. defn
макрос раскрывается в форму, которая добавляет (meta (var f)
к f
метаданным. И (meta (var f)
включает дополнительную информацию, которой нет в (meta f)
, когда f
определяется в первый раз. Итак, мой вопрос теперь таков: почему defn
реализован так?
java -cp clojure.jar clojure.main
Clojure 1.2.0
user=> (defn f [x] x)
#'user/f
user=> (meta f)
{:ns #<Namespace user>, :name f}
user=> (meta (var f))
{:ns #<Namespace user>, :name f, :file "NO_SOURCE_PATH", :line 1, :arglists ([x])}
user=> (macroexpand '(defn f [x] x))
(def f (.withMeta (clojure.core/fn f ([x] x)) (.meta (var f)))) ; (.meta x) seems to be the same as (meta x)
user=>