请在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”的话。

...