Ist es möglich, einen Clojure-Namespace auf mehrere Quelldateien aufzuteilen, wenn Sie vorab kompilieren :gen-class
? Wie (:main true)
und (defn- ...)
ins Spiel kommen?
quelle
Ist es möglich, einen Clojure-Namespace auf mehrere Quelldateien aufzuteilen, wenn Sie vorab kompilieren :gen-class
? Wie (:main true)
und (defn- ...)
ins Spiel kommen?
Natürlich können Sie das, tatsächlich ist der clojure.core
Namespace selbst auf diese Weise aufgeteilt und bietet ein gutes Modell, dem Sie folgen können, indem Sie nachsehen src/clj/clojure
:
core.clj
core_deftype.clj
core_print.clj
core_proxy.clj
..etc..
Alle diese Dateien sind beteiligt, um den einzelnen clojure.core
Namespace aufzubauen .
Eine davon ist die Primärdatei, deren Name mit dem Namespace-Namen übereinstimmt, sodass sie gefunden wird, wenn jemand sie in einem :use
oder erwähnt :require
. In diesem Fall ist die Hauptdatei clojure/core.clj
und beginnt mit einem ns
Formular. Hier sollten Sie Ihre gesamte Namespace-Konfiguration ablegen, unabhängig davon, welche Ihrer anderen Dateien sie möglicherweise benötigen. Dies beinhaltet normalerweise :gen-class
auch so etwas wie:
(ns my.lib.of.excellence
(:use [clojure.java.io :as io :only [reader]])
(:gen-class :main true))
Verwenden Sie dann an geeigneten Stellen in Ihrer Primärdatei (meistens alle am Ende) load
Ihre Hilfedateien. Darin clojure.core
sieht es so aus:
(load "core_proxy")
(load "core_print")
(load "genclass")
(load "core_deftype")
(load "core/protocols")
(load "gvec")
Beachten Sie, dass Sie weder das aktuelle Verzeichnis als Präfix noch das .clj
Suffix benötigen .
Jede der Hilfedateien sollte zunächst deklarieren, welchem Namespace sie helfen, sollte dies jedoch mithilfe der in-ns
Funktion tun . Für den obigen Beispiel-Namespace beginnen die Hilfsdateien alle mit:
(in-ns 'my.lib.of.excellence)
Das ist alles was es braucht.
Da alle diese Dateien einen einzigen Namespace erstellen, kann sich jede von Ihnen definierte Funktion in einer der Primär- oder Hilfsdateien befinden. Dies bedeutet natürlich, dass Sie Ihre gen-class
Funktionen in jeder gewünschten Datei definieren können :
(defn -main [& args]
...)
Beachten Sie, dass Clojure der normalen Reihenfolge-of-Definitionsregeln noch für alle Funktionen anwenden, so dass Sie sicherstellen müssen , dass das, was Datei definiert eine Funktion geladen wird , bevor Sie versuchen , verwenden , um diese Funktion.
Sie haben auch nach dem (defn- foo ...)
Formular gefragt , das eine Namespace-Private-Funktion definiert. Auf diese Weise definierte Funktionen sowie andere :private
Variablen sind im Namespace, in dem sie definiert sind, sichtbar, sodass die primäre und alle Hilfsdateien Zugriff auf private Variablen haben, die in einer der bisher geladenen Dateien definiert sind.