Clojure 2024调查中分享您的想法!

欢迎!请访问关于页面了解这个系统的更多信息。

+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 构造函数。在针对 ratio 类型进行数学运算的代码之外,当结果为整数时,它会明确地将分子和分母约到最低公约数,并返回一个整数对象,而不是 ratio 对象。因此,您的构造函数调用似乎有意绕开这一点,深入到应保留为 Clojure 内部实现而不是支持 API 的调用中。
0 投票
by

我不知道 Clojure 维护者对这个想法的看法,但一个会让许多人更容易找到细节,而不会显著增加编译进 Clojure 图像的 doc 字符串长度的方法,是在 doc 字符串中添加一句话,“有关更多信息,请参阅 https://clojure.org/guides/equality”。

...