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 函数)”?
by
事实上,这可能是Clojure中继承元数据的类的唯一示例。我浏览了Github仓库(你可以点击查看引用,非常方便!),但没有找到其他类似案例。当然,当你考虑Clojure中没有内置的类时,天高任鸟飞。

需要澄清的一个关键点是,“元数据不影响等价性”这一规则被另一个规则所取代,“更改元数据将产生一个新的对象”,当这些对象按标识比较时,例如函数。
by
在Clojure中,很少有东西可以具有元数据,我所知道的只有在外部添加的持久集合的额外实现,大多数或所有这些比较等价性是通过值而不是标识。我同意在第三方库中可能会有很多可能,但我不认为你能找到很多这样的例外。
+1
by

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

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

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

...