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

欢迎!请参阅 关于 页面,了解此功能的更多信息。

0
ClojureScript
这个ClojureScript的变更
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:简单地将{{goog.math}}项从{{int?}}和相关中删除。

替代方案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为true
{{integer?}} 对于goog.math.isInt/Number.isInteger、goog.math.Integer或goog.math.Long为true
{{int?}} 对于goog.math.isInt/Number.isInteger或goog.math.Long为true

目标是与一些平台原生态概念一致吗?如果是这样,那么
{{number?}} 对于typeof-number、goog.math.Integer或goog.math.Long为true
{{integer?}} 对于goog.math.isInt/Number.isInteger、goog.math.Integer或goog.math.Long为true
{{int?}} 仅对于goog.math.isInt为true

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


在Java/CLJ中,这三个目标彼此之间更加一致。任何数字作为标识符都可以用于clj算术(所以最宽的检查,{{number?}},也可以用于算术检查),而{{int?}}与主机最原始的整数值类型(与对象类型)相对应。

CLJS缺少数字直方图,因此更有趣。
目前,在CLJS中,{{number?}}似乎被设计为一个谓词,用于测试是否可以进行算术运算,因此它只允许js type-of===number。{{integer?}}也是一种算术检查,但它希望是一个非分数数(有趣的是,仍然允许不安全的整数,即超出Number.MAX_SAFE_INTEGER的范围,因为在这里正常的整数算术不工作——也许它应该只允许安全整数)。  {{int?}}不关心算术,但它仍然有助于检查一个值是否可以是数值标识符(例如,通过transit接收到的记录ID);但柳杰的int?并不关心这一点。

0
_评论提交者:mfikes_

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

补丁A可能可以按现有方式应用。

另一方面,补丁B似乎有很多与{{number?}}是否可以参与算术运算或用于其他当前使用数字的场所相关的后果。我怀疑我们可以让所有这些工作,但我们也会放弃很多性能。

例如,这是一个有效的程序,并且应该返回{{true}}吗?


(zero? goog.math.Integer/ZERO)
0
参考: https://clojure.atlassian.net/browse/CLJS-2921(由mfikes报告)
...