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" 的话。

欢迎来到 Clojure спроси и получи ответы, где вы можете задавать вопросы и получать ответы от членов сообщества Clojure.
...