2017-02-13 19 views
2

Я написал несколько макросов обертки вокруг одной библиотеки JavaScript (PRNG). Тогда я хотел создать функциональность, предоставляемую кроссплатформенностью макросов. (т. Е. Я хочу иметь другую реализацию этих макросов для JVM).Что такое правильный способ создания кроссплатформенных макросов в Clojure (Script)?

Каков правильный способ сделать это в Clojure?

Или у меня есть только один макрос, который во время компиляции обнаруживает, используется ли он для JVM или JS и возвращает соответствующий код?

+1

Я думаю, что условия для чтения и 'cljc' - это то, что вам нужно. https://clojure.org/guides/reader_conditionals. Вы можете определить различные реализации макросов для разных целевых платформ, а компилятор будет читать правильную версию в зависимости от того, какая цель используется при использовании. – leetwinski

+2

Нет, условия чтения обычно не подходят для кросс-платформенных, поскольку макросы ClojureScript написаны на Clojure, поэтому для индикатора платформы будет установлено значение: clj, а не: cljs. Обратите внимание, что макросы действительно связаны с кодом ПИСЬМА, а не с чтением (где удобны условия чтения). –

ответ

2

Обратите внимание, что в ClojureScript макросы написаны на языке Clojure (как и в Clojure). [Оставляя в стороне морщину самодостаточного ClojureScript.] Таким образом, условия читателя будут принимать только ветвь :clj в макрокоде в любом случае.

Это постоянный предмет обсуждения. Относящиеся нить и билет здесь:

Одним из вариантов является просто написать две версии макроса, один для Clojure и один для ClojureScript. Другой - использовать какой-то трюк среды, чтобы определить, какую платформу вы вызываете макрос в контексте. Есть несколько способов сделать это. Один пример:

(def ^:private ^:no-doc cljs? (boolean (find-ns 'cljs.analyzer)))