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

欢迎!有关此功能的工作原理,请参阅关于页面获取更多信息。

+1
Java 互操作

这似乎是一个疏忽,因为这些函数缺失。有 unchecked-divide-int 和 unchecked-remainder-int 函数,但没有 long 类型的等效函数,尽管对其他未检查操作都提供了 long 类型的等效函数。JVM 为长除法和余数提供了字节码。

Clojure 文档中关于页面 https://clojure.org/java_interop 的 “Java 原始类型支持” 部分,有 unchecked-divide 和 unchecked-remainder 的链接,但它们在 Clojure 中不存在,因此 API 链接的目标不存在。

要么将这添加到 Clojure,要么从文档中删除这些看起来是个好主意。

9 个答案

0

评论者:coltnz

尝试解决这个问题。

0

评论者:coltnz

  • 还为 unchecked-divide-int 和 unchecked-remainder-int 添加了测试。
  • 未检查的函数仅支持二元参数,当检查将会抛出 CompilerException(ArityException) 时,不会抛出。
  • 对 Java 互操作病例(例如使用 Java 集合从 Clojure 运行高性能代码)中的 (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 添加了对原始长整型的缺失的unchecked-divide和unchecked-remainder函数。”

谢谢!

0

评论者:coltnz

哎呀,对不起,Alex。

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

0

评论者:alexmiller

补丁格式看起来更好。进一步查看补丁本身,就 clojure 而言,它已经使用了正确的bytecode来进行检查或不检查,所以可能甚至不需要?

如果我不使用补丁来编译(

(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](https://clojure.atlassian.net/browse/CLJ-1545)(由jafingerhut报告)
...