由于def形式编译的实现细节,其参数中的调用使用applyTo而不是直接使用invoke方法进行评估。这迫使IFn实现者即使在不需要的情况下也要实现applyTo。
提出的补丁将InvokeExpr.eval改为使用AFn.applyToHelper,因此当可能时,将使用invoke而不是applyTo。
目前失败代码的示例,Patch后会工作
user=> (deftype x [] clojure.lang.IFn (invoke [_] 1)) user.x user=> (def a ((x.))) AbstractMethodError clojure.lang.Compiler$InvokeExpr.eval (Compiler.java:3553)