2011-05-24 137 views
3

我想將一個大的clojure腳本分成更小的。它看起來像這樣。Clojure命名空間

一:

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

(def status "WORKING") 

二:

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

(defn show [] (println status)) 

結果:異常

PS我明白一些某種遞歸的命名空間構造發生。我知道只有一個草率的半解決方案,如定義沒有身體之前轉化爲名稱空間?有什麼建議麼?

回答

11

+1爲ponzao的答案。詳細闡述一下:命名空間的循環依賴性往往是一個標誌,你沒有正確地獲取抽象和/或API。無論是「混合」層還是事物都應該放在一個名稱空間中,因爲它們真的屬於一個整體。

如果您只想將一個名稱空間拆分爲多個文件,這也是可能的。

名稱/ space.clj:

(ns name.space) 

(declare status) 

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

名稱/ space_one.clj:

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

名稱/ space_two.clj:

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

Clojure不支持名稱空間之間的循環依賴關係。你必須設計以避免它。 – 2011-06-03 17:43:21

+4

@ stuart-sierra我說過不同的東西嗎? – kotarak 2011-06-04 17:58:33

6

您正在構建兩個組件之間的循環依賴關係,您確定這是您想要的嗎?爲什麼不有第三個名稱空間包含它們的通用功能?

+1

我**不**想通過製作許多抽象層等來過度工程**一個簡單的項目。一個文件保存數據,設置和處理的所有內容。我不想將它用作網絡服務的一部分。但是,對於桌面調試,我使用簡單的可視化,它從主腳本讀取設置,但給出了一個單一的功能,以在屏幕上顯示這個東西。謝謝。 – 2011-05-24 10:06:56