[解決済み] Clojureの名前空間を複数のファイルに分割する
質問
で先読みコンパイルするとき、Clojure名前空間を複数のソースファイルに分割することは可能ですか?
:gen-class
? どのように
(:main true)
と
(defn- ...)
が登場するのでしょうか?
どのように解決するのですか?
概要
確かに、実際、できます
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
変数と同様に定義された関数は、それらが定義された名前空間内から見えるので、主ファイルとすべてのヘルパーファイルは、これまでにロードされたファイルのいずれかで定義されたプライベート変数にアクセスすることができます。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン