Что является эквивалентом Clojure константы "public static final" в Java - PullRequest
10 голосов
/ 18 июля 2010

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

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

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

Ответы [ 6 ]

6 голосов
/ 06 февраля 2012

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

Редактировать

Очевидно, это Clojure 1.3, и это ^:const, а не ^:constant.См. Как работает Clojure ^: const? для краткого изложения.

6 голосов
/ 18 июля 2010

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

3 голосов
/ 19 июля 2010

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

3 голосов
/ 19 июля 2010

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

(defmacro my-constant [] 5)

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

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

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

3 голосов
/ 18 июля 2010

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

2 голосов
/ 18 июля 2010

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

...