Константы времени компиляции Clojure

Этот вопрос исходит исключительно из «умственного мастерства» и, вероятно, не имеет практического значения.

Если я определю значение в 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.

7
задан Ralph 10 November 2011 в 12:46
поделиться