回答:
確かにできます。実際、clojure.core
名前空間自体はこのように分割されており、次の場所を調べることで従うことができる優れたモデルを提供しますsrc/clj/clojure
。
core.clj
core_deftype.clj
core_print.clj
core_proxy.clj
..etc..
これらすべてのファイルが参加して、単一のclojure.core
名前空間を構築します。
これらの1つは、名前空間名と一致するように名前が付けられたプライマリファイルで、誰かが:use
やで言及したときに検出され:require
ます。この場合、メインファイルはclojure/core.clj
であり、ns
フォームで始まります。これは、他のどのファイルが必要とするかに関係なく、すべての名前空間構成を配置する場所です。これには通常も含ま:gen-class
れるため、次のようなものです。
(ns my.lib.of.excellence
(:use [clojure.java.io :as io :only [reader]])
(:gen-class :main true))
次に、プライマリファイルの適切な場所(通常は最後にすべて)でload
ヘルパーファイルを取り込みます。でclojure.core
、それは次のようになります。
(load "core_proxy")
(load "core_print")
(load "genclass")
(load "core_deftype")
(load "core/protocols")
(load "gvec")
現在のディレクトリをプレフィックスとして必要としないし、.clj
サフィックスも必要ないことに注意してください。
各ヘルパーファイルは、支援する名前空間を宣言することから開始する必要がありますが、in-ns
関数を使用して宣言する必要があります。したがって、上記の名前空間の例では、ヘルパーファイルはすべて次のように始まります。
(in-ns 'my.lib.of.excellence)
それだけです。
これらのすべてのファイルが単一の名前空間を構築しているため、定義する各関数は、プライマリファイルまたはヘルパーファイルのいずれかに置くことができます。もちろん、これはgen-class
、任意のファイルで関数を定義できることを意味します。
(defn -main [& args]
...)
Clojureの通常の定義順序規則は引き続きすべての関数に適用されることに注意してください。そのため、その関数を使用する前に、関数を定義するファイルがロードされていることを確認する必要があります。
(defn- foo ...)
名前空間プライベート関数を定義するフォームについても質問しました。このように定義された関数と他の:private
変数は、それらが定義されているネームスペース内から表示できるため、プライマリおよびすべてのヘルパーファイルは、これまでに読み込まれたファイルで定義されたプライベート変数にアクセスできます。