4

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-macroorを使用してアクセスできるのはマクロだけのようです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 の両方をターゲットにしたい場合、これは本当に今の状態ですか?

4

2 に答える 2

3

あなたは状況を正しく理解しているようです:)

に関して:「xx(ClojureまたはClojureScriptの両方)のユーザーは、各変数(数十個ある可能性があります)がその実装のマクロに依存しているかどうか、およびその名前空間がどの名前空間に属しているかを知る必要があります。」

さらに2つの名前空間、api.cljとapi.cljsを追加して、そのapiの各変数に適切な名前空間を含め、その決定からいくつかの苦痛を取り除くことができます。しかし、このエリアはまだかなり新しいようです。

于 2012-12-12T19:03:44.193 に答える