Я пишу некоторый код Clojure, который зависит от многих констант.
Они будут использоваться в трудных внутренних циклах, таким образом, будет важно, чтобы они использовались и оптимизировались максимально эффективно комбинацией Clojure compiler+JVM. Я был бы, обычно использовал "общедоступную статическую заключительную" константу в Java для той же цели.
Что лучший способ состоит в том, чтобы объявить их?
Я думаю, что def
- размещение вещей в глобальном пространстве имен - это примерно то, к чему вы можете приблизиться.
Если действительно, действительно, действительно нужна константа (я полагаю, JIT заметит, что значение является постоянным, и все же поступит правильно), вы можете использовать макрос.
(defmacro my-constant [] 5)
Это довольно уродливо, но я думаю, критичный для производительности код всегда будет уродливым.
(do-stuff (my-constant) in-place)
Однако будьте осторожны с тем, что вы добавляете в макрос! Я бы не стал этого делать только для некоторых буквальных констант. В частности, не объекты.
Если просто использование def
недостаточно быстро, вы можете попробовать создать связанный псевдоним let
перед входом в свой жесткий цикл, чтобы избежать перебора переменных. каждый раз.
Здесь нет defconst
, поэтому использование глобального def является идиоматичным; что касается оптимизации, то JIT сделает все быстро.
как сказано выше, используйте def или atom, помните, данные неизменяемы, поэтому, если вы объявляете некоторые константы в списке, они не меняются.