问题:在许多情况下,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?检查的代码,这些代码随后将委托到适当的类型版本的功能,或者在找不到匹配项时抛出InvalidArgumentException。
匹配规则将与Java相同。
这将与所有现有的defn使用向后兼容。特别是,它应该扩展/增强/取代现有的原始函数处理方式。
将来,这项技术可能会与core.typed结合使用,以确保根据类型推断选择最有效的函数版本。