2017-02-13 9 views
2

1つのJavaScript lib(PRNG)の周りにいくつかのラッパーマクロを書きました。 次に、このマクロクロスプラットフォームによって提供される機能を作りたかったのです。 (つまり、JVM用にこのマクロを別の実装にしたいと考えています)。Clojure(Script)でクロスプラットフォームマクロを書く適切な方法は何ですか?

Clojureで適切な方法は何ですか?

コンパイル時にJVMやJSで使用されているコードを返すマクロを検出できますか?

+1

私はあなたが必要とするのは、読者の条件と 'cljc'です。 https://clojure.org/guides/reader_conditionals。異なるターゲットプラットフォーム用に異なるマクロの実装を定義することができます。コンパイラは、使用する場合、ターゲットに応じて正しいバージョンを読み込みます。 – leetwinski

+2

いいえ、ClojureScriptマクロはClojureで記述されているため、一般的に読者の条件文はクロスプラットフォームには適していないため、プラットフォームインジケータはclj、not:cljsに設定されます。マクロはWRITINGコードに本当に関心があり、読んではいけません(読者の条件が役に立つ場所です)。 –

答えて

2

ClojureScriptではマクロがClojureで書かれていることに注意してください(Clojureと同様)。 [自己ホスト型ClojureScriptのしわを脇に残す]したがって、どちらの場合でも、読者の条件文はマクロコード内で:cljブランチのみをとることになります。

これは引き続き議論の対象です。ここに関連するスレッドとチケット:

1つのオプションは、単にマクロの2つのバージョン、Clojureのための1とClojureScriptのための1つを書くことです。別の方法は、環境のいくつかのトリックを使用して、コンテキストの中でマクロを呼び出すプラットフォームを判断することです。これを行うにはいくつかの方法があります。一例:

(def ^:private ^:no-doc cljs? (boolean (find-ns 'cljs.analyzer))) 
関連する問題