[英]What is the Clojure equivalent of a “public static final” constant in Java
我正在编写一些依赖于许多常量的Clojure代码。
它们将在紧密的内部循环中使用,因此通过Clojure编译器+ JVM组合尽可能高效地使用和优化它们非常重要。 我通常会在Java中使用“public static final”常量来达到同样的目的。
申报这些的最佳方式是什么?
我认为def
全局命名空间-ing的事情是最接近你能来。
我相信Clojure 1.3(或者1.4)允许你在def
上放置一个^:constant
标记,这表示编译器应该是一个常量,所有引用都应该在编译时解析。
显然它是Clojure 1.3,它是^:const
,而不是^:constant
。 请参阅Clojure ^:const如何工作? 总结。
没有defconst
,所以只使用全局def是惯用的; 就优化而言,JIT会让事情变得更快。
如果真的,真的,真的想要常量(我相信,JIT会注意到值是不变的并做正确的事情),你可以使用宏。
(defmacro my-constant [] 5)
这是相当丑陋的,但我认为性能关键代码总是很难看。
(do-stuff (my-constant) in-place)
但要注意你放入宏中的内容! 我不会超过一些文字常量。 特别是不是对象。
如果只使用def
不够快,你可以尝试在进入紧密循环之前创建一个let
绑定别名,以避免每次都通过var。
如上所述使用def或atom,记住,数据是不可变的,所以如果你在列表中声明一些常量,它们就不会改变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.