请分享您的想法在2024年Clojure现状调查!

欢迎!请参阅关于页面以了解更多关于这个问答功能的信息。

0 投票
ClojureScript

错误报告

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

参考:https://clojure.net.cn.reference/metadata
"元数据不会影响等价性"

2 个回答

+1 投票

选取
 
最佳答案

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

因此,当依赖于对象身份时,等价性是真的“受到影响的”。例如,对于编译后的函数:(not= (fn []) (fn [])),无论元数据如何。

可能需要澄清。

人们提出关于这个问题的看法时,是否在寻找诸如“元数据不会影响等价性(除非在某些相等性是对象身份的情况下,例如比较Clojure函数)这样的资格认证?”
实际上,可能这就是Clojure中唯一内建的带有元数据和通过标识比对的类的例子。我在Github仓库中浏览了一下(你能通过点击查看引用真是太方便了!)但没有找到另外的例子。当然,当考虑非Clojure内建类时,可能性是无限的。

需要明确的是,当这些对象通过标识比对时,规则“元数据不会影响相等性”被另一个规则“更改元数据将产生新对象”所取代,例如像函数这样的对象。
在Clojure中,能拥有元数据的事物种类并不多,我仅知道Clojure之外添加的,主要是持久性集合的额外实现,且大多数或全部都是通过值而非标识来比较相等性。我同意第三方库中可实现性的无限性,但我怀疑在这个例外的例子中能找到的例子不多。
+1 投票

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

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

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

...