Clojure:为什么函数';当我重新输入元数据的定义时,元数据是否会更改?

Clojure:为什么函数';当我重新输入元数据的定义时,元数据是否会更改?,clojure,metadata,Clojure,Metadata,像这样: 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_SOU

像这样:

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

Clojure使用元数据存储函数的读取位置、文档等信息。重新定义函数可以改变这一点


发件人:

了解元数据的一个重要方面是,它不被视为对象值的一部分。因此,元数据不会影响相等性(或哈希代码)。只有元数据不同的两个对象是相等的

另一种方法是考虑相反的情况:假设Culjure没有重置元数据。

(defn fun []
  "docs for the original function"
  ...)
然后重新定义它:

(defn fun []
   ;; no doc string, different body
   ...)
如果不重置元数据
(doc fun)
将给出“原始功能的文档”


最后,vars的重新定义通常是在开发过程中完成的,而不是在程序的正常执行过程中。因此,完全重新定义它是有意义的,而不是保留以前定义中的内容。

显然,这种行为在Clojure 1.2中或多或少是“偶然的”,在1.3中有所改变:


在1.3中,只有Var包含元数据-函数本身没有被
defn

分配任何元数据,但我没有重新定义函数,我只是第二次输入了相同的定义(并且从中读取函数的位置两次都是相同的,即REPL)。根据固定表达式应具有常量值且应尽可能避免副作用的原则,像重复
defn
这样简单的操作会向元数据添加新信息,而这些信息也可能是第一次添加的,这似乎有些奇怪(我知道这不会影响表达式的值,但感觉还是不对)。重新定义函数就是重新定义,即使函数是相同的。Clojure不记得你的定义,只记得编译后的代码,也不尝试比较新旧代码。好的方面,+1。但我发布了google group的线程,并接受了这一点,因为它更接近我所寻找的内容。
(defn fun []
   ;; no doc string, different body
   ...)