Что Clojure эквивалентен из “общедоступной статической заключительной” константы в Java

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

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

Что лучший способ состоит в том, чтобы объявить их?

10
задан mikera 18 July 2010 в 17:32
поделиться

5 ответов

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

6
ответ дан 3 December 2019 в 17:19
поделиться

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

(defmacro my-constant [] 5)

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

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

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

3
ответ дан 3 December 2019 в 17:19
поделиться

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

3
ответ дан 3 December 2019 в 17:19
поделиться

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

3
ответ дан 3 December 2019 в 17:19
поделиться

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

2
ответ дан 3 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: