1. ホーム
  2. namespaces

[解決済み] Clojureの名前空間を複数のファイルに分割する

2023-02-06 18:17:30

質問

で先読みコンパイルするとき、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 変数と同様に定義された関数は、それらが定義された名前空間内から見えるので、主ファイルとすべてのヘルパーファイルは、これまでにロードされたファイルのいずれかで定義されたプライベート変数にアクセスすることができます。