2
我在一個JavaScript庫(PRNG)中編寫了一些包裝宏。 然後我想提供這個宏跨平臺提供的功能。 (即我想爲JVM有不同的這個宏的實現)。在Clojure(腳本)中編寫跨平臺宏的正確方法是什麼?
在Clojure中使用它的正確方法是什麼?
或者我可以只有一個宏在編譯時檢測它是否被用於JVM或JS並返回相應的代碼?
我在一個JavaScript庫(PRNG)中編寫了一些包裝宏。 然後我想提供這個宏跨平臺提供的功能。 (即我想爲JVM有不同的這個宏的實現)。在Clojure(腳本)中編寫跨平臺宏的正確方法是什麼?
在Clojure中使用它的正確方法是什麼?
或者我可以只有一個宏在編譯時檢測它是否被用於JVM或JS並返回相應的代碼?
請注意,在ClojureScript中,宏是用Clojure編寫的(就像在Clojure中一樣)。 [撇開自託管的ClojureScript的皺紋。]因此,無論哪種情況,閱讀器條件只會採用宏代碼中的:clj
分支。
這是一個正在討論的議題。這裏相關話題和票務:
一種選擇是簡單地寫宏的兩個版本,一個是Clojure的,一個用於ClojureScript。另一種是使用環境的一些技巧來確定在上下文中調用宏的平臺。有幾種方法可以做到這一點。一個例子:
(def ^:private ^:no-doc cljs? (boolean (find-ns 'cljs.analyzer)))
我想讀者條件和'cljc'是你所需要的。 https://clojure.org/guides/reader_conditionals。您可以爲不同的目標平臺定義宏的不同實現,並且編譯器將根據使用的目標讀取正確的版本。 – leetwinski
不,閱讀器條件通常不適合跨平臺,因爲ClojureScript宏是用Clojure編寫的,所以平臺指示符將被設置爲:clj,而不是:cljs。請注意,宏真正關心WRITING代碼,而不是閱讀它(這是讀者條件有用的地方)。 –