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

欢迎!请查看关于页面以获取更多关于此功能的信息。

0
编译器

问题:在许多情况下,Clojure 编译器已经拥有足够的关于函数参数类型的信息,可以在 JVM 上静态生成最高效的代码(即不进行 instance? 检查、类型转换或其他动态多态调用的形式)。在 Clojure 中,我们目前无法做到这一点,这迫使对性能有强烈要求的开发者使用一些不太自然或复杂的解决方案。

提议是简单地允许函数接受函数参数的类型提示重载,例如:

(defn foo
((^double x) (Math/floor x))
((^float x) (Math/floor (double x)))
((^String s) (count s)))

将始终生成具有正确参数数量的“Object”版本代码,这将保持与 IFn 接口的兼容性,并确保函数仍然可以在动态/交互式环境中使用。如果没有显式提供“Object”版本,则会生成它来使用 instance? 检查,随后将其委托给适当的类型化函数版本(或者在找不到匹配项时抛出 IllegalArgumentException)。

匹配规则将与 Java 相同。

这将与所有现有的 defn 使用保持向后兼容。特别是,它应该扩展、增强或取代现有原始函数的处理方式。

未来,此技术可能与 core.typed 一起使用,以确保基于类型推断选择最有效的函数版本。

1 答案

0
参考资料: https://clojure.atlassian.net/browse/CLJ-1256 (由 mikera 报告)
...