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