namespace を持つライブラリ xx がありxx.core
、Clojure と ClojureScript の両方をターゲットにするつもりで、純粋な Clojure でそれを書いているとしましょう。これを行うための事実上の方法は、lein-cljsbuild のクロスオーバーと条件付きコメントを使用するようです。ここまでは順調ですね。 この前提は現在では時代遅れです。lein-cljsbuild はリーダーの条件を優先して非推奨になりました。他にも多くの名前空間/マクロ ClojureScript 拡張機能があります。以下の更新された回答を参照してください。
xx には、Clojure と ClojureScript の両方でユーザーに使用してもらいたい変数がたくさんあるとします。これらは 3 種類の変数に分割できます。
- マクロ
- 関数 / xx のマクロに依存しないその他の変数 (これらをタイプ 1 変数と呼びます)
- たまたま行う関数/その他の変数は、xx のマクロに依存します (これらをタイプ 2 変数と呼びます)
ただし、ClojureScript では、マクロを.cljs
独自の特別な名前空間で通常の名前空間から分離する必要があるため.clj
、すべてのマクロを .xml 内の他のすべての変数から分離する必要がありますxx.core
。
しかし、これらの他の変数 (タイプ 2 変数) の実装は、これらのマクロに依存しています!
(確かに、ClojureScript のuse-macro
orを使用してアクセスできるのはマクロだけのようですrequire-macro
。ちょうど今、これをテストしました。すべて (マクロ、タイプ 1 変数、およびタイプ 2 変数) を 1 つのxx/core.clj
ファイル内に単純に保持し、それを参照してみました。を使用する ClojureScript テスト ファイルで(:use-macro xx.core :only […])
. 次にコンパイラは、ClojureScript ファイルが参照するWARNING: Use of undeclared Var
マクロ以外の変数ごとにメッセージをxx.core
出力します。)
この状況で人々は何をする傾向がありますか?私にできる唯一のことは、ライブラリのパブリック API を3 つの名前空間に分割することです。1 つはタイプ 1 変数用、もう 1 つはマクロ用、もう 1 つはタイプ 2 変数用です。…<code>xx.core、、、xx.macro
およびxx.util
?…</p>
のようなもの
もちろん、この種の悪臭は、今では xx (Clojure と ClojureScript の両方) のすべてのユーザーが、各 var (数十あるかもしれない) がその実装のマクロにたまたま依存しているかどうか、どの名前空間がどの名前空間に依存しているかを知る必要があるためです。属する。Clojure のみを対象とする場合、これは必要ありません。Clojure と ClojureScript の両方をターゲットにしたい場合、これは本当に今の状態ですか?