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` 不是相等的。  因此它进行了一些不区分大小写的比较,但具体是什么并不明确。
by
另一个奇怪示例
    user=> (= 1/1 (clojure.lang.Ratio. (biginteger 1) (biginteger 1)))
    false
    user=> (= 1/2 (clojure.lang.Ratio. (biginteger 1) (biginteger 2)))
    true
by
我不是这方面的权威,但我的猜测是,Clojure 的实现从来没有意图支持直接调用 clojure.lang.Ratio 构造函数。  在对比率类型进行数学计算时,构造函数之外的代码会显式地将分子和分母约简为最简形式,并且在结果是整数时返回一个整数对象,而不是比率对象。  因此,您的构造函数调用似乎是故意规避这一点的,它们深入到了 Clojure 的内部实现,而不是其支持的 API。
0
by

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

...