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

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

0
Clojure
反射不会在 JVM 调用之间返回相同的方法顺序(通过 Class::getMethods)。这在将 Clojure 函数(Callable 和 Runnable)提交到执行器时最为明显。


(ns repro)

;;(set! *warn-on-reflection* true)

(defn repro
  []
  (let [exec (java.util.concurrent.ForkJoinPool/commonPool)
        work #(do 1)]
    (deref (.submit ^Object exec work))))  ;; 故意反射

(defn -main []
   ;; dereffing a runnable returns nil, a callable can return a value, in this case an integer
  (System/exit (or (repro) 0)))



nondeterministic ➜ while true; do clojure -m repro; echo $?; done
0
0
0
1
0
0
0
1
0
0
0

5 答案

0

由 gshayban 提出的评论

附上一个排序已查看方法的补丁

0

由 gshayban 提出的评论

补丁的 re:比较器的第一次传递(检查参数数量)可能会消失:只有相同参数数量的方法才会进行比较。这听起来对吗?

0

由 bronsa 提出的评论

是的,对我而言听起来是正确的

0

由 gshayban 提出的评论

带有更简洁比较器的补丁

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