Этот вопрос исходит исключительно из "умственного мастерства" и, вероятно, не имеет практического значения.
Если я определяю значение в Clojure, используя def
, можно ли заставить компилятор вычислять его во время компиляции, а не ждать до выполнения?
(def the-answer 42)
(+ the-answer 1)
Полагаю, я мог бы определить макрос, но синтаксис вызова становится неловким:
(defmacro the-answer [] 42)
(+ (the-answer) 1)
Это также работает, но все еще ужасно:
(+ `~the-answer 1)
Я также понимаю (или верю), что Clojure вычисляет константные выражения во время компиляции:
(def milliseconds-per-day (* 24 60 60 1000))
Я только изучаю Common Lisp, но, насколько я понимаю, Common Lisp поддерживает пользовательские макросы для чтения, поэтому вы можете определить макрос для чтения (что-то вроде #$
), который оценивает следующий символ во время компиляции:
(+ #$the-answer 1)
Кстати, этот синтаксис не "красивее", чем вызов макроса.
Как заставить Clojure оценивать постоянные переменные во время компиляции и заменять ссылку на фактическое значение? Это уже так?
Прежде чем кто-либо начнет цитировать Закон Кнута («преждевременная оптимизация - корень всего зла»), я задаю этот вопрос, чтобы лучше понять внутреннюю часть компиляции Clojure.