Определение константы в Clojure

Я пытаюсь определить макрос для определения синтаксиса констант времени компиляции, который был добавлен в 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
5
задан MisterMetaphor 7 February 2012 в 14:08
поделиться