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))))

但是,js 中的所有数字已经是双精度浮点数,所以这些都是不必要的

(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(一个将数值修约为零的私有函数),如果可用。

现有的 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补丁。

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

LGTM。

0

评论者:mfikes

因为这是一项低级数值更新,还通过ChakraCore运行了单元测试(成功)。

0

评论者:mfikes

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

0
参考:https://clojure.atlassian.net/browse/CLJS-1164(由 favila 报告)
...