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