评论者为:alexyakushev
我尝试了 (link: ~alexmiller) 提出的实现。该补丁使用 getComponentType 而不是字符串魔法,并与第一个补丁相比有了以下改进
- 现在支持了 aset。除最后一个索引外的所有索引都被展开为 {{RT.aget}} 调用,最外层调用被展开为 {{RT.aset}}。
- 如果内联版本无法在任何地方解析数组的类型,则它将生成对非内联 {{aget}} 调用的调用,该调用将使用 {{Array.get}}(这更快),而不是展开为 N 个 {{RT.aget}} 调用(这将导致 N 个编译器反射点)。
缺点是,现在多参数调用 {{aset}} 触发了编译器反射,而之前是 {{Array.set}}。我怀疑是否有必要使这些角落更平滑,或者是否在这种情况下使反射更可见(显示在编译器警告中)。
我还附上了验证示例的 REPL 日志(使用 clj-java-decompiler)。将它转换为测试会很不错,但我还不知道如何做。
顺便说一句,我不得不使用一个巧妙的 {{((var aget) ...)}} 来强制调用非内联版本。我并不喜欢这样做,但我还没有想出更好的方法。另一种方法是将非内联版本分离为独立的私有函数,但我不想向核心命名空间添加更多的变量。