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

欢迎!有关这如何工作的更多信息,请参阅 关于 页面。

+6
文档

= 的当前文档字符串如下
> 以类型无关的方式比较数字和集合

这听起来像是通过值比较数字,检查数轴上的点是否重合。

然而,实际上

user=> (= 1. 1)
false

地址 https://clojure.org/guides/equality#_summary 解释了原因,但最好在文档字符串中也加入这些信息。

2 答案

+4

遵循相同的文档字符串,我看到一些关于以下内容的困惑
> 与 Java 中 x.equals(y) 相同,但也可以用于 nil

并且人们期望这意味着相同的事情

(defrecord Foo [a])

(= (Foo. 1)
   {:a 1})
;; => false

(.equals (Foo. 1)
         {:a 1})
;; => true
我还注意到`=`认为`(long 1)`和`(short 1)`是相等的,但不是`1`和`1.0`。因此它进行了一些不区分大小写的比较,但具体是什么不清楚。
另一个奇怪的例子
    user=> (= 1/1 (clojure.lang.Ratio. (biginteger 1) (biginteger 1)))
    false
    user=> (= 1/2 (clojure.lang.Ratio. (biginteger 1) (biginteger 2)))
    true
我不是这个问题的专家,但我的猜测是,Clojure的实现在从未打算支持直接调用clojure.lang.Ratio构造函数。在进行比率类型的数学运算时,该构造函数之外有代码会将分子和分母约分到最简形式,当结果为整数时返回一个整型对象,而不是比例对象。因此,您的构造函数调用似乎有意跳过了这部分,深入到Clojure内部实现,而非其支持的API。
0

我不知道Clojure维护者对这个想法的看法,但为了使许多人的细节更容易找到,同时不显著增加编译到Clojure图像的doc字符串的长度,可以在doc字符串中添加类似“有关详细信息,请参阅https://clojure.org/guides/equality"的句子。

...