89 votes

Fractionner un espace de noms Clojure sur plusieurs fichiers

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?

135voto

Chouser Points 3248

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X