Я пытаюсь определить макрос для определения синтаксиса констант времени компиляции, который был добавлен в Clojure 1.3:
== 2.14 ^: const defs ==
^: const позволяет вы называете примитивные значения более быстрой ссылкой.
(def constants {: pi 3.14: e 2.71})
(def ^: const pi (: pi constants)) (def ^: const e (: e constants))
Накладные расходы на поиск : e и: pi на карте происходит при компиляции времени, поскольку (: константы pi) и (: константы e) вычисляются, когда их родительские формы def оцениваются.
В основном мне нужен синтаксический сахар вокруг (def ^: const ... ...)
, поэтому я пытаюсь сделать это так:
(defmacro defconst [const-name const-val]
`(def ^:const ~const-name ~const-val))
Но это не работает:
user=> (macroexpand '(defconst pi 3.14))
(def pi 3.14)
Из того, что я понял, мета-ярлык # ^ <...>
- это макрос для чтения, и для определения макроса, который добавляет к чему-либо некоторые метаданные, следует использовать (with-meta ...)
.
Я не нашел никакой документации по ^: const
. Создает ли эта синтаксическая конструкция хоть какие-то метаданные? Следующий пример ничего не показывает:
user=> (def ^:const pi 3.14)
#'user/pi
user=> (meta pi)
nil