Этот вопрос исходит исключительно из «умственного мастерства» и, вероятно, не имеет практического значения.
Если я определю значение в 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.