2017-02-13 44 views
2

我在一個JavaScript庫(PRNG)中編寫了一些包裝宏。 然後我想提供這個宏跨平臺提供的功能。 (即我想爲JVM有不同的這個宏的實現)。在Clojure(腳本)中編寫跨平臺宏的正確方法是什麼?

在Clojure中使用它的正確方法是什麼?

或者我可以只有一個宏在編譯時檢測它是否被用於JVM或JS並返回相應的代碼?

+1

我想讀者條件和'cljc'是你所需要的。 https://clojure.org/guides/reader_conditionals。您可以爲不同的目標平臺定義宏的不同實現,並且編譯器將根據使用的目標讀取正確的版本。 – leetwinski

+2

不,閱讀器條件通常不適合跨平臺,因爲ClojureScript宏是用Clojure編寫的,所以平臺指示符將被設置爲:clj,而不是:cljs。請注意,宏真正關心WRITING代碼,而不是閱讀它(這是讀者條件有用的地方)。 –

回答

2

請注意,在ClojureScript中,宏是用Clojure編寫的(就像在Clojure中一樣)。 [撇開自託管的ClojureScript的皺紋。]因此,無論哪種情況,閱讀器條件只會採用宏代碼中的:clj分支。

這是一個正在討論的議題。這裏相關話題和票務:

一種選擇是簡單地寫宏的兩個版本,一個是Clojure的,一個用於ClojureScript。另一種是使用環境的一些技巧來確定在上下文中調用宏的平臺。有幾種方法可以做到這一點。一個例子:

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