2024 Clojure 状态调查!中分享您的看法。

欢迎!请参阅关于页面了解有关此工作的更多信息。

0
ClojureScript

错误报告

(defn f [] 1)
=> #'cljs.user/f
(= f (with-meta f {:a 1}))
=> false ;; should be true

关于:https://clojure.org/reference/metadata
"元数据不会影响等价性"

2 答案

+1

被选为最佳答案
 
最佳答案

页面也说“只有元数据不同的两个对象是相等的”以及“具有不同元数据的对象是不同的对象”。

因此,当它依赖于对象标识时,等价性确实“受到影响”。例如,对于编译函数:`(not= (fn []) (fn []))`无论元数据如何。

可能需要澄清。

人们是关于这个寻找某种资格,比如“元数据不会影响等价性(除非在一些情况下,等价性是对象标识,例如比较 Clojure 函数)”吗?
的确,这可能是在Clojure中实现的唯一一个携带元数据并通过身份比较的类示例。我浏览了Github仓库(点击查看引用真的很方便!),但没有找到另一个。当然,当你考虑不是集成在Clojure中的类时,天空才是极限。

需要澄清的关键点是,当比较对象通过身份,例如函数时,规则“元数据不影响相等等性”被另一个规则“更改元数据生成一个新对象”所取代。
可以有元数据的事物种类并不多,既不是Clojure中的,而且我所知唯一在Clojure外部添加的是持久化集合的额外实现,它们大多数或全部通过值而不是身份比较 eq 等性。我同意第三方库中的可能性是无限的,但我怀疑你很难找到这种例外情况的例子。
+1

我认为这不是一个错误。它的行为与JVM Clojure相同。

函数没有值语义,所以它们的 = 实现将回退到对象的引用比较。

当您向函数添加元数据时,它将变成一个不同的函数对象,因此 = 返回 false。

...