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

欢迎!请参阅 关于 页面以了解关于本站更详细的信息。

0
ClojureScript

quot 和 rem 函数的实现过于复杂。目前它们是:

(defn quot [n d] (fix (/ (- n (js-mod n d)) d))) (defn rem [n d] (- n (* d (quot n d))))

然而,JavaScript 中的所有数字已经是双精度浮点数了,所以这些都是不必要的

(defn quot [n d] (fix (/ n d))) (defn rem [n d] (js-mod n d)))

请注意,“rem” 实际上就是 js-mod,我不确定为什么之前没有人注意到这一点。为了保持与很多代码的一致性,我现在保留 js-mod,同时也考虑到如果 cljs 以后扩展了数字塔,这个区别可能很重要。

附加了补丁,它还

  • 创建了一个 quot 和 rem 的宏版本。
  • 更新了 quot、rem、js-mod 和 mod 的文档,以便更清晰。
  • 如有必要,使用 ES6 Math.trunc() 实现 fix(私有函数,用于四舍五入到 0)。

现有 quot 和 rem 测试通过,尽管可以对边缘情况进行一些更好的测试(负数、NaN 和 ±Infinity 参数)。

9 答案

0

评论由:favila 发布

更好的测试在我更新后的 {{rem}} 中发现了舍入错误,它应该保持原样。(毕竟不是简单的 js-mod!看来会先对参数进行舍入?从规范中看不出来。)然而 quot 是正确的,并且比当前的版本引入的错误更少。我会在我有机会时更新补丁和测试。

0

评论由:favila 发布

附有测试的可用补丁。测试已扩展以覆盖浮点数情况。{{rem}} 现在与 master 基本相同(曾经比 js-mod 更精确!!),但对于非有限参数或零除数,它返回与 js-mod 一致的结果。

0

评论者:mfikes

cljs-1164.patch 在master上不再适用

0

评论者:arichiardi

补丁现在适用。我只用Nashorn测试过

`

V8_HOME 未设置,跳过V8测试
SPIDERMONKEY_HOME 未设置,跳过SpiderMonkey测试
JSC_HOME 未设置,跳过JavaScriptCore测试
使用Nashorn进行测试

...

运行了185个包含17195个断言的测试。
0次失败,0次错误。
测试了4个可能js目标中的1个
`

0

评论者:arichiardi

清理了补丁

0

评论者:mfikes

成功通过V8、SpiderMonkey、JavaScriptCore和Nashorn单测运行了Andrea对Francis补丁的更新。

我还手动运行了使用补丁构建的bootstrapped ClojureScript的一些单元测试。

LGTM.

0

评论者:mfikes

由于这是一个低级别的数值更新,还通过ChackraCore运行了单元测试(成功)。

0

评论者:mfikes

CLJS-1164-1.patch 已不再适用于master

0
...