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类型为===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
回答者
...