簡體   English   中英

什么是Java中的“公共靜態最終”常量的Clojure等價物

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM