2024年Clojure调查!分享您的想法。

欢迎!请参阅关于页面获取更多关于如何使用这个网站的信息。

0
ClojureScript
This ClojureScript change
https://github.com/clojure/clojurescript/commit/bcf60ce194e5292fbc5c4b2d89dfc5a7b886b94c
跟踪了此Clojure更改
https://github.com/clojure/clojure/commit/20f67081b7654e44e960defb1e4e491c3a0c2c8b

结果之一是,{{int?}} 会接受由 {{goog.math.Integer}} 满足,而它是非固定精度的。
此外,它还可能导致一种情况:值满足 {{int?}} 但不满足 {{integer?}} 或 {{number?}}。(注意,这也影响了类似 {{pos-int?}} 的事物。)

我建议两种不同的方法来解决这个问题,我们可以就此进行辩论

备选方案A:简单从 {{int?}} 和相关项中删除 {{goog.math}} 项目。

备选方案B:让 {{goog.math.Long}} 值满足 {{number?}}、{{integer?}} 和 {{int?}},让 {{goog.math.Integer}} 值满足 {{number?}} 和 {{integer?}}。

在这种情况下,文档字符串应进行调整。

我将附上两个具体的补丁供考虑/讨论。

3 答案

0
_评论:favila_

CLJS 中各种数值谓词的目标应该是什么?

目标是与 CLJ 中这些谓词的意义保持一致吗?如果是这样,那么
{{number?}} 针对 typeof-number 或 goog.math.Integer 或 goog.math.Long
{{integer?}} 针对 goog.math.isInt/Number.isInteger 或 goog.math.Integer 或 goog.math.Long
{{int?}} 针对 goog.math.isInt/Number.isInteger 或 goog.math.Long

目标是要与平台原生的某些概念保持一致吗?如果是这样,那么
{{number?}} 针对 typeof-number 或 goog.math.Integer 或 goog.math.Long
{{integer?}} 针对 goog.math.isInt/Number.isInteger 或 goog.math.Integer 或 goog.math.Long
{{int?}} 针对 goog.math.isInt 仅

目标是进行我可以使用此值进行算术的类型检查吗?如果是这样,那么
{{number?}} 针对 typeof-number 仅
{{integer?}} 针对 goog.math.isInt(或者甚至可能 Number.isSafeInteger)
{{int?}} 与 integer? 相同


在 Java/CLJ 中,这三个目标之间的一致性要强得多。任何以数字为标识的数字都可以用于 clj 算术(因此最宽的检查 {{number?}} 也可以用于算术检查),而 {{int?}} 与宿主的最原始整数值类型(与对象类型)完全对应。

CLJS 缺少一个数字塔,所以这更有趣。
目前,在CLJS中,{{number?}}似乎被设计成一个谓词,用于测试算术是否可行,因此它只允许js中的type-of===number。{{integer?}}也是一个算术检查,但希望是一个非分数的数(有趣的是,它仍然允许不安全的整数,即超出Number.MAX_SAFE_INTEGER的范围,在正常整数算术中不起作用——也许它应该只允许安全的整数)。 {{int?}}不考虑算术,但它仍然可以用来查看一个值是否可能是数值标识符(例如,通过transit接收到的记录id);但这与CLJ的int?所关注的并不是一回事。

0
评论者:mfikes

附带的A和B补丁探讨了两种方法。

补丁A可能可以按目前的形式应用。

另一方面,补丁B似乎与很多与{{number?}}能够参与算术或用于其他当前使用数字的地方有关。我相信我们能使这一切正常工作,但我们将会失去很多性能。

具体来说,这是一个有效的程序,并且应该返回{{true}}吗?


(zero? goog.math.Integer/ZERO)
0
...