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

欢迎!请参阅关于页面了解此工作的更多信息。

+1
Java 交互

这看起来可能是遗漏了这些功能。存在unchecked-divide-int和unchecked-remainder-int函数,但没有为longs提供等效函数,尽管对于其他未检查操作,longs都有等效函数。JVM具有长除法和余数的字节码。

Clojure文档中关于"Java原语支持"章节的"关于"页面有关于unchecked-divide和unchecked-remainder的链接,但由于Clojure中没有这些API,因此API链接的目标不存在。

将它们添加到Clojure中或从文档中删除它们似乎是个好主意。

9 个答案

0

由:coltnz发表的评论

尝试解决这个问题。

0

由:coltnz发表的评论

  • 还添加了对unchecked-divide-int和unchecked-remainder-int的测试。
  • 未检查函数仅支持二进制arity,并且会在未检查的情况下抛出CompileException(ArityException)。
  • 对于高性能的Clojure代码,例如在Clojure中使用Java集合,(int,long)和(long,int)覆盖有什么价值吗?
0

由:alexmiller发表的评论

谢谢您这样做,Colin!

1) 当我应用补丁(git apply CLJ-1545.diff)时,出现了一堆空白错误,这些错误需要清理。此外,补丁似乎未能应用到test/clojure/test_clojure/numbers.clj中的更改。看起来可能是diff的格式不正确。你可能需要查看关于使用git format-patch的说明,请访问http://dev.clojure.org/display/community/Developing Patches

2) 如果你能在git提交信息中提供更有用的信息,那就更好了。例如:“CLJ-1545 添加了原始长整型缺少的未检查除法和未检查余数”。

谢谢!

0
通过

由:coltnz发表的评论

哎呀,对不起,Alex。

新补丁,有更好的提交信息。

0
通过

由:alexmiller发表的评论

补丁格式看起来更好。就令牌本身而言,据我所知 Clojure 已经会使用正确的字节码以检查或未检查,因此这可能根本不是必需的?

如果没有应用(这个)补丁,编译:

(defn foo-div ^long [^long a ^long b] (quot a b))

那么该fn的字节码是

`
public final long invokePrim(long, long);

Code:
   0: lload_1
   1: lload_3
   2: ldiv
   3: lreturn

`

类似地,两个长整数的quot会生成相同的代码,但使用lrem。我认为补丁对产生的字节码没有净影响?

0
通过

做出的评论:jafingerhut

Alex,你在之前的评论中是否对 **unchecked-math** 的值为true或false进行了测试?如果是false,那么我认为如果CLJ-1254被判定为bug,那你看到的这些也是同样未处理的bug。

0
通过

由:alexmiller发表的评论

无论是 unchecked-math 的哪一设置,当前的结果都是相同的,但我理解了你的观点。

回忆起关于({{/Long/MIN_VALUE -1}})的情况,我认为你是对的。unchecked-divide和remainder应该与当前的(checked)形式执行相同的操作,而常规的除法和余数情况应该进行溢出检查。我认为CLJ-1254应该涵盖quot的变化。

0

由:coltnz发表的评论

user=> (dotimes (link: 6) (time (dotimes (link: 50000000) (unchecked-divide 4 (System/currentTimeMillis)))))
"已消耗时间:1806.942毫秒"
"已消耗时间:1808.747毫秒"
"已消耗时间:1865.074毫秒"
"已消耗时间:1802.777毫秒"
"已消耗时间:1839.468毫秒"
"已消耗时间:1830.61毫秒"
nil
user=> (dotimes (link: 6) (time (dotimes (link: 50000000) (/ 4 (System/currentTimeMillis)))))
"已消耗时间:5003.598毫秒"
"已消耗时间:4998.182毫秒"
"已消耗时间:4941.237毫秒"
"已消耗时间:5036.517毫秒"
"已消耗时间:4965.867毫秒"
"已消耗时间:4982.693毫秒"

0
参考: https://clojure.atlassian.net/browse/CLJ-1545(由jafingerhut报告)
...