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])))
Почему фактический макрос был написан менее обычным способом?
Ответы
Ответ 1
core.clj построен сверху донизу, начиная с того, что Java предоставляет и создает все требования для Clojure по мере его появления. Когда when
определено, цитата синтаксиса еще не существует.
Макрос when
определен в строке 456 файла core.clj, а требования к синтаксису-цитате недоступны до тех пор, пока строка 682. когда макрос используется для определения цитирования синтаксиса