Хотя функции clojure и clojurescript в основном одинаковы (кроме очевидных различий), макросы не являются. Когда мне нужен макрос в clojurescript, я должен записать его в clojure и потребовать его с помощью require-macros. Это техническое ограничение javascript или просто дизайнерское решение? Почему оба варианта не могут быть одинаковыми?
Почему макросы clojurescript не могут быть записаны в clojurescript?
Ответ 1
Из ClojureScript: Up and Running от Стюарта Сьерра и Лукера Вандер Харта, стр. 69:
Макросы применяются во время процесса компиляции. Они не существуют во время выполнения. Потому как компилятор ClojureScript реализован в Clojure, макросы ClojureScript должны быть написаны в Clojure, а не ClojureScript. К счастью, Clojure и ClojureScript почти идентичны когда дело доходит до манипулирования структурами данных, поэтому переключение между двумя языками не сложно.
Это означает, что макрокод выполняется в Clojure мире, а не в браузере, поэтому он должен быть написан простым Clojure.