52

Clojureで名前空間を使用するための適切なアドバイスと一般的な方法を見つけるのに苦労しています。名前空間はJavaパッケージと同じではないことに気付いたので、Clojureの規則を教えようとしていますが、これは驚くほど判断が難しいようです。

関数をcljファイルに分割する方法、さらにはそれらのファイルをディレクトリに整理する方法については、かなり良い考えがあると思います。しかし、それを超えると、開発環境のメカニズムを見つけるのに苦労しています。相互に関連するいくつかの質問:

  1. Clojure名前空間には、Javaパッケージに通常使用するのと同じ一意性規則を使用しますか?[つまり、backwards-company-domain.project.subsystem]
  2. 名前空間と一致するディレクトリ構造にファイルを保存する必要がありますか?[ala Java]
  3. 複数の名前空間がある場合、すべてのコードをjarにコンパイルし、クラスパスに追加してアクセスできるようにする必要がありますか?
  4. 各名前空間を1つのjarにコンパイルする必要がありますか?または、多くの名前空間からのcljコードを含む単一のjarを作成する必要がありますか?

ありがとう...

4

2 に答える 2

42
  1. あなたがそれが役立つと思うならそれは大丈夫だと思いますが、多くのClojureプロジェクトはそうしません-cf。Compojure(トップレベルのcompojurensとさまざまなcompojure。*nsを特定の機能に使用)、Ring、Leiningen ... Clojure自体はclojure。*(およびcontribライブラリにはclojure.contrib。*)を使用しますが、これは特殊なケースです。私は考えます。

  2. はい!絶対にそうする必要があります。そうしないと、Clojureは名前空間を見つけることができません。また、名前空間名にアンダースコアを使用したり、ファイル名にハイフンを使用したりしないでください。名前空間名にハイフンを使用する場合は、ファイル名にアンダースコアを使用する必要があります(nsmy.cool-projectがで呼び出されるファイルで定義されるcool_project.cljように)と呼ばれるディレクトリmy

  3. すべてのものがクラスパス上にあることを確認する必要がありますが、それがjar、複数のjar、ファイルシステム上のjarとディレクトリの混合であるかどうかは関係ありません...正しい命名規則に従っている限り(あなたのポイント2)あなたは元気でなければなりません。

    ただし、特別な理由がない場合は、事前にコンパイルしないでください。これにより、ロード時間がわずかに改善されるだけでなく、さまざまなバージョンのClojure間でコードを移植できなくなる可能性があります。

    特に一部のJava相互運用シナリオでは、AOTコンパイルを使用する必要がある場合があります。関連する関数/マクロのドキュメントには、常にそれが記載されています。clojure.contribにAOTを必要とするものの例があります。私はそれを必要としたことがないので、詳細についてはあまり説明できません。

  4. コードの機能単位にはjarを使用する必要があると思います。たとえば、CompojureとRingは、パッケージ全体を構成する多くの名前空間を含む単一のjarとしてパッケージ化されます。また、clojure.contribは、特に、複数の無関係なライブラリを含む単一のjarとしてパッケージ化されています。しかし、それもまた特別な場合かもしれません。

    一方、プロジェクトのすべてのコードとその依存関係を含む単一のjarは、デプロイメントに役立つ場合があります。ある種のものがあなたに役立つかもしれないと思うなら、Leiningenビルドツールとその「uberjar」機能をチェックしてください。

于 2010-02-08T17:06:58.500 に答える
10
  1. 厳密に言えば、必須ではありませんが、特に内部プロジェクトやプライベートAPIの場合、多くのJavaプロジェクトでもその規則が廃止されています。ただし、単一セグメントの名前空間は避けてください。デフォルトのパッケージでクラスファイルが生成される可能性があります。
  2. はい。

3と4に関しては、パッケージ化とAOTコンパイルは、名前空間の規則の問題と完全に直交しています。

于 2010-02-08T17:14:06.733 に答える