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

时间:2010-04-02 20:38:52

标签: clojure annotations types

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

2 个答案:

答案 0 :(得分:15)

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

description的java互操作部分中有一个clojure.org。其中包括:

  

Clojure支持使用类型提示来帮助编译器避免在性能关键的代码区域中反映。通常情况下,应该避免使用类型提示,直到出现已知的性能瓶颈。

     

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

您始终可以打开警告反射标记以查看调用反射的位置,从而确定类型提示可能有用的位置。

编辑:

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

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

  

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

答案 1 :(得分:8)

我知道你已经接受了答案,这不是你问题的直接答案,但是刘刚刚发表了一篇关于Functional Fluid Dynamics in Clojure的非常好的文章,当出于性能原因提到类型提示时,这篇文章很有教育意义。