2011-05-24 4 views
3

Je veux diviser un grand script de clojure en plus petits. Et ça ressemble à ça.namespaces Clojure

One:

(ns one 
    (:use [two :only (show)])) 

(def status "WORKING") 

Deux:

(ns two 
    (:use [one :only (status)])) 

(defn show [] (println status)) 

Résultat: Exception. Je comprends qu'un certain type de construction d'espace de noms récursif se produit. Je connais seulement une demi-solution bâclée, comme définissantsans corpsavant référençant aux espaces de noms? Aucune suggestion?

Répondre

11

+1 pour la réponse de ponzao. Pour développer un peu plus: Les dépendances cycliques des espaces de noms sont souvent un signe, que vous n'avez pas eu vos abstractions et/ou APIs correctement. Soit vous "mélangez" les calques ou les choses devraient simplement être dans un espace de noms, parce que les choses vont vraiment ensemble.

Si vous souhaitez simplement diviser un espace de noms en plusieurs fichiers, cela est également possible.

Nom/space.clj:

(ns name.space) 

(declare status) 

(load "space_one") 
(load "space_two") 

Nom/space_one.clj:

(in-ns 'name.space) 
(defn show [] (println status)) 

Nom/space_two.clj:

(in-ns 'name.space) 
(def status "WORKING") 
+1

Clojure ne prend pas en charge les dépendances cycliques entre les espaces de noms. Vous devez concevoir pour l'éviter. –

+4

@ stuart-sierra Ai-je dit quelque chose de différent? – kotarak

6

Vous construisez une dépendance cyclique entre deux composants, êtes-vous sûr que c'est ce que vous voulez? Pourquoi ne pas avoir un troisième espace de noms contenant leurs fonctions communes?

+1

I ** ne pas ** vouloir ** sur-ingénieur ** un projet simple en faisant à de nombreuses couches d'abstractions et etc. Un fichier conserve les données, les paramètres, et tout pour le traitement. Je ne voulais pas l'utiliser dans le cadre du service web. Mais pour le débogage de bureau, j'utilise une visualisation simple, qui lit les paramètres du script principal, mais donne une seule fonction pour montrer cette chose sur un écran. Je vous remercie. –