2024年Clojure调查问卷中分享您的想法!

欢迎!请查看关于页面了解有关此工作的一些更多信息。

+1
Java互操作

这似乎是一个疏忽,这些(函数)缺失。有unchecked-divide-int和unchecked-remainder-int函数,但是没有长整型的等效函数,尽管对于除法外的其他未检查操作都有长整型的等效函数。JVM有长除法和取余的字节码。

Clojure官方文档在“支持Java原始类型”这一章节中(请参阅https://clojure.org/java_interop)提供了unchecked-divide和unchecked-remainder的链接,但由于它们在Clojure中不存在,API链接的目标地址也不存在。

似乎给Clojure添加这些函数或从文档中删除它们是件好事。

9 答案

0

评论由:coltnz

试着解决这个问题。

0

评论由:coltnz

  • 还添加了unchecked-divide-int和unchecked-remainder-int的测试。
  • 未检查的函数只支持二元参数,当参数数量不正确时会抛出CompilerException(ArityException),而正常的检查模式下则不会。
  • 对于使用高性能代码从Clojure中使用Java集合的互操作情况,比如(int,long) (long,int)重载有何价值?
0

评论由:alexmiller

谢谢承担这个任务,Colin!

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

2) 如果您能提供一个更有用的 git 提交信息,那就更好了。例如:“CLJ-1545 添加了对原始 long 的 missing unchecked-divide 和 unchecked-remainder”。

谢谢!

0
by

评论由:coltnz

对不起,Alex。

带有更好提交信息的补丁。

0
by

评论由:alexmiller

补丁格式看起来更好。根据我的看法,Clojure 已经会使用正确的字节码处理 checked 或 unchecked,因此这可能根本不是必需的?

如果没有补丁编译

(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

`

同样,两个 long 的 quot 返回相同的代码,但使用 lrem。我认为补丁对生成的字节码没有影响?

0
by

评论者:jafingerhut

Alex,你上一个评论中的测试是在 unchecked-math 为 true 或 false 时进行的吗?如果为 false,那么如果 CLJ-1254 被认为是 Bug,那么你看到的这个行为也是 Bug,它错过了相同的边缘情况。

0
by

评论由:alexmiller

无论 unchecked-math 的设置如何,当前结果都是相同的,但我明白了你的观点。

回想一下 {{(/ Long/MIN_VALUE -1)}} 的情况,我认为你是对的。(new) unchecked-divide / remainder 应该执行当前 (checked) 形式所执行的操作,并且正则除法和余数应进行溢出检查。我认为 CLJ-1254 应涵盖 quot 的更改。

0
by

评论由:coltnz

user=> (dotimes (link: 6) (time (dotimes (link: 50000000) (unchecked-divide 4 (System/currentTimeMillis)))))
"Elapsed time: 1806.942 msecs"
经过时间:1808.747 毫秒
经过时间:1865.074 毫秒
经过时间:1802.777 毫秒
经过时间:1839.468 毫秒
经过时间:1830.61 毫秒
nil
用户=> (dotimes (链接: <em 6) (时间 (dotimes (链接: <em 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 报告)
...