Est-il possible de scinder un espace de noms Clojure en plusieurs fichiers source lors de la compilation anticipée avec :gen-class
? Comment (:main true)
et (defn- ...)
entrent-ils en jeu?
Réponse
Trop de publicités?Vue d'ensemble
Certainement, vous pouvez, en fait, clojure.core
de l'espace de noms lui-même est divisé de cette manière et fournit un bon modèle qui vous pouvez suivre en regardant en src/clj/clojure
:
core.clj
core_deftype.clj
core_print.clj
core_proxy.clj
..etc..
Tous ces fichiers de participer à construire le simple clojure.core
d'espace de noms.
Fichier Principal
L'un d'eux est le fichier principal, nommé pour correspondre à l'espace de noms du nom de sorte qu'il sera trouvé quand quelqu'un mentionne dans un :use
ou :require
. Dans ce cas, le fichier principal est clojure/core.clj
, et il commence avec un ns
formulaire. C'est où vous devez mettre toute votre configuration d'espace de noms, peu importe lequel de vos autres fichiers peuvent en avoir besoin. Cela comprend normalement :gen-class
ainsi, donc, quelque chose comme:
(ns my.lib.of.excellence
(:use [clojure.java.io :as io :only [reader]])
(:gen-class :main true))
Puis, à des endroits appropriés dans votre fichier principal (le plus souvent, tout à la fin) utiliser load
d'apporter dans vos fichiers d'aide. En clojure.core
il ressemble à ceci:
(load "core_proxy")
(load "core_print")
(load "genclass")
(load "core_deftype")
(load "core/protocols")
(load "gvec")
Notez que vous n'avez pas besoin de le répertoire courant comme un préfixe, ni avez-vous besoin de l' .clj
suffixe.
Les fichiers d'aide
Chacun des fichiers d'aide doit commencer par la déclaration d'espace de noms ils aident, mais il devrait le faire à l'aide de l' in-ns
fonction. Donc pour l'exemple de l'espace de noms ci-dessus, les fichiers d'aide serait à mettre en rapport avec:
(in-ns 'my.lib.of.excellence)
C'est tout ce qu'il faut.
gen-classe
Parce que tous ces fichiers sont la construction d'un espace de noms unique, chaque fonction que vous définissez peut être primaire ou les fichiers d'aide. Bien sûr, cela signifie que vous pouvez définir vous - gen-class
fonctions dans n'importe quel fichier que vous souhaitez:
(defn -main [& args]
...)
Notez que Clojure de l'ordre normal de la définition de règles continuent de s'appliquer pour toutes les fonctions, de sorte que vous devez vous assurer que tout fichier définit une fonction est chargé avant d'essayer d' utiliser cette fonction.
Privé De Vars
Vous avez également posé des questions sur l' (defn- foo ...)
forme qui définit un espace de noms privé. Fonctions définies comme ceci ainsi que d'autres :private
vars sont visibles de l'intérieur de l'espace de noms où elles sont définies, de sorte que le primaire et tous les fichiers d'assistance, auront accès privé vars défini dans l'une quelconque des fichiers chargés jusqu'à présent.