Подтвердить что ты не робот

Clojure, когда макрос

Я просматривал источник clojure, и я был удивлен тем, как определяется макрос:

user=> (source when)
(defmacro when
  "Evaluates test. If logical true, evaluates body in an implicit do."
  {:added "1.0"}
  [test & body]
  (list 'if test (cons 'do body)))
nil
user=>

Я ожидал, что вместо этого будет написано что-то вроде этого:

(defmacro when [test & body] `(if ~test (do [email protected])))

Почему фактический макрос был написан менее обычным способом?

4b9b3361

Ответ 1

core.clj построен сверху донизу, начиная с того, что Java предоставляет и создает все требования для Clojure по мере его появления. Когда when определено, цитата синтаксиса еще не существует.
Макрос when определен в строке 456 файла core.clj, а требования к синтаксису-цитате недоступны до тех пор, пока строка 682. когда макрос используется для определения цитирования синтаксиса