Clojure で小さな Web フレームワークを作ろうとしています。/handlers ディレクトリにたくさんの clojure ファイルがあり、プロジェクトの .core 名前空間でそれらすべてを要求したいと考えています。すべてのファイルは、独自の名前空間を定義します。例: project.handlers.home。この背後にある考え方は、新しいハンドラーを追加するときに、コア ファイルの名前空間宣言を変更してそれを含めたくないということです。私が思いついた唯一の解決策は、ディレクトリ内のすべてのファイルを見つけて、それらを clojure.core/load でロードすることですが、美しく慣用的なものとはほど遠いものです。これを行う慣用的な方法はありますか?
2 に答える
これを行う慣用的な方法はありますか?
IMO、いいえ。Clojure のイディオムは通常、「マジックを行う」よりも明示的であることを好みます。特に、グローバル オブジェクトの名前付けに関しては (名前空間の自動読み込みは明らかにそうです)。
新しいハンドラーを追加するときに「コア」ファイルを変更したくない理由はわかりませんが、「コア」とハンドラーの両方をロードしてそれらをフックする追加の名前空間を導入することを検討してください。
Noirにはこのような機能がいくつか含まれており、特定のディレクトリの下に名前空間をロードするための明示的な API 呼び出しになっています。この例については、load-viewsを参照してください。これを使用してパスを自動ロードしました。
ただし、ノワールのアプローチは、関与する魔法の量と、アプローチからの追加の複雑さ (たとえば、長引くパス定義) のため、慣用的とは感じられませんでした。
ツール、フレームワーク、またはライブラリの観点から名前空間を見つける必要がある場合は、in を使用find-namespaces
してtools.namespace
から、require/load します。このアプローチは、ユーザー レベルのプラグ可能性を提供するという点で役立ちます。ユーザーがハンドラーをディレクトリにドロップすると、コード内の新しいオプションが表示されますが、ここでも明示的である方が大幅にクリーンになる傾向があります。