1つのJavaScript lib(PRNG)の周りにいくつかのラッパーマクロを書きました。 次に、このマクロクロスプラットフォームによって提供される機能を作りたかったのです。 (つまり、JVM用にこのマクロを別の実装にしたいと考えています)。Clojure(Script)でクロスプラットフォームマクロを書く適切な方法は何ですか?
Clojureで適切な方法は何ですか?
コンパイル時にJVMやJSで使用されているコードを返すマクロを検出できますか?
1つのJavaScript lib(PRNG)の周りにいくつかのラッパーマクロを書きました。 次に、このマクロクロスプラットフォームによって提供される機能を作りたかったのです。 (つまり、JVM用にこのマクロを別の実装にしたいと考えています)。Clojure(Script)でクロスプラットフォームマクロを書く適切な方法は何ですか?
Clojureで適切な方法は何ですか?
コンパイル時にJVMやJSで使用されているコードを返すマクロを検出できますか?
ClojureScriptではマクロがClojureで書かれていることに注意してください(Clojureと同様)。 [自己ホスト型ClojureScriptのしわを脇に残す]したがって、どちらの場合でも、読者の条件文はマクロコード内で:clj
ブランチのみをとることになります。
これは引き続き議論の対象です。ここに関連するスレッドとチケット:
1つのオプションは、単にマクロの2つのバージョン、Clojureのための1とClojureScriptのための1つを書くことです。別の方法は、環境のいくつかのトリックを使用して、コンテキストの中でマクロを呼び出すプラットフォームを判断することです。これを行うにはいくつかの方法があります。一例:
(def ^:private ^:no-doc cljs? (boolean (find-ns 'cljs.analyzer)))
私はあなたが必要とするのは、読者の条件と 'cljc'です。 https://clojure.org/guides/reader_conditionals。異なるターゲットプラットフォーム用に異なるマクロの実装を定義することができます。コンパイラは、使用する場合、ターゲットに応じて正しいバージョンを読み込みます。 – leetwinski
いいえ、ClojureScriptマクロはClojureで記述されているため、一般的に読者の条件文はクロスプラットフォームには適していないため、プラットフォームインジケータはclj、not:cljsに設定されます。マクロはWRITINGコードに本当に関心があり、読んではいけません(読者の条件が役に立つ場所です)。 –