在Clojure代码中何时何地放置类型注释?

Mic*_*ent 15 types annotations clojure

在Clojure代码中何时何地放置类型注释?当性能很重要时.但是,有什么规则可以让你(只有在做Java Interop?时)以及在哪里添加它们(函数定义参数)?

Rob*_*lan 15

我所知道的最重要的原因是性能.在clojure中的类型提示会消除反射,这可能会降低性能.所以我会将类型提示放在我测量的性能关键的函数中.

clojure.org的java interop部分中有一个描述.在评论中:

Clojure支持使用类型提示来帮助编译器避免在性能关键的代码区域中反映.通常,在存在已知性能瓶颈之前,应避免使用类型提示.

...一旦将类型提示放在标识符或表达式上,编译器将尝试在编译时解析对方法的任何调用.此外,编译器将跟踪任何返回值的使用并推断它们的使用等类型,因此需要很少的提示才能获得完全编译时解析的一系列调用.请注意,静态成员(或其返回值!)不需要类型提示,因为编译器始终具有静态类型.

您始终可以打开警告反射标记以查看反射被调用的位置,因此,类型提示可能有帮助.

编辑:

关于你的问题"仅适用于java互操作?" - 没有.即使在纯粹的clojure应用程序中,类型提示也很有用.反射速度降低性能的问题是JVM上的事实,并且是动态语言通常必须处理的问题.

关于可以放置类型提示的位置,来自clojure.org:

它们可以放在函数参数,let-bound名称,var名称(定义时)和表达式上:


Mic*_*ohl 8

我知道你已经接受了答案,这不是你问题的直接答案,但是刘刚刚在Clojure上发表了一篇关于功能流体动力学的非常好的文章,当出于性能原因提到类型提示时,它非常有教育意义.