Что такое эквивалент Clojure константы "public static final" в Java

Я пишу код Clojure, который зависит от количества констант.

Они будут использоваться в жестких внутренних циклах, поэтому важно, чтобы они были максимально эффективно использованы и оптимизированы с помощью комбинации Clojure compiler + JVM. Я бы обычно использовал константу "public static final" в Java для той же цели.

Каков наилучший способ объявить об этом?

Ответ 1

Я думаю, что def -поведение вещей в глобальном пространстве имен примерно так же близко, как вы можете прийти.

Ответ 2

Я полагаю, что Clojure 1.3 (или, возможно, 1,4) позволяет поместить тег ^:constant в def, что означает, что это компилятор должен быть константой, и все ссылки должны быть разрешены во время компиляции.

Изменить

По-видимому, это Clojure 1.3, а ^:const, а не ^:constant. См. Как Clojure ^: const работает? для сводки.

Ответ 3

Если действительно, действительно, действительно хочу, чтобы константа была на месте (я полагаю, JIT заметит, что значение является постоянным и делает правильную вещь), вы можете использовать макрос.

(defmacro my-constant [] 5)

Это довольно уродливо, но критический код производительности всегда будет уродлив, я думаю.

(do-stuff (my-constant) in-place)

Обратите внимание на то, что вы положили в макрос! Я бы это сделал не больше, чем некоторые литеральные константы. В частности, не объекты.

Ответ 4

Если просто использовать def недостаточно быстро, вы можете попробовать создать связанный псевдоним let, прежде чем вводить свой жесткий цикл, чтобы не переходить через var каждый раз.

Ответ 5

как сказано выше, используйте def или atom, помните, данные неизменяемы, поэтому, если вы объявляете некоторые константы в списке, они не меняются.

Ответ 6

Нет defconst, поэтому просто использование глобального def является идиоматическим; что касается оптимизации, JIT быстро справится.