请在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 图像中的文档字符串长度,就是向文档字符串中添加一个类似 "有关更多信息,请参阅 https://clojure.org/guides/equality" 的句子。

...