评论由:favila 制作
我在 CLJ 1.8 和 master (1.9)以及 Java 8 上确认了这个问题仍然存在。
我能够诊断出问题的原因。问题在于 PHMs 的 {{.fold}} 方法为 {{fjinvoke}} 创建了一个 {{Callable}}(而不是一个 {{IFn}}),但 {{fjinvoke}} 会像一个正常的 clojure 函数({{IFn .invoke}})一样调用它的参数。这是唯一提供纯 {{Callable}} 给 {{fjinvoke}} 的 Clojure-core foldable 数据结构。通常这个问题不会出现,因为任务不是在运行的任务中调用的,而是在一个已经运行的任务中执行的嵌套折叠会在 {{fjinvoke}} 中的 {{(f)}} 行触达并崩溃。
因为 Clojure 函数也是 {{Callable}},所以我的修复方案是将 {{fjinvoke}} 的契约收紧,接收一个 {{Callable}} 并用 {{.call}} 调用参数而不是调用它。另一种修复方案是将 PHM 的 {{.fold}} 改为创建一些更具 Clojure 函数风格的东西(既可调用也可调用)。