2011-05-24 135 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