Clojure命名空间

3
我希望您能将一个较大的Clojure-Script分割成更小的部分。其代码如下。

1:

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

(def status "WORKING")

第二步:

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

(defn show [] (println status))

结果: 异常

PS 我知道发生了某种递归命名空间构建。我只知道一个粗略的半解决方案,比如在引用命名空间之前定义没有主体的命名空间?有什么建议吗?

2个回答

12

对于ponzao的回答加一分。再详细解释一下:命名空间的循环依赖通常意味着你没有正确抽象或设计API。要么你混合了层次,要么东西应该在一个命名空间中,因为它们真正属于一起。

如果你只想将一个命名空间拆分成多个文件,这也是可能的。

name/space.clj:

(ns name.space)

(declare status)

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

名称/空间_一.clj:

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

name/space_two.clj:

->

name/space_two.clj:

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

1
Clojure不支持命名空间之间的循环依赖。您必须进行设计以避免它。 - Stuart Sierra
4
@stuart-sierra,我说了不同的话吗? - kotarak

6
你正在构建两个组件之间的循环依赖,你确定这是你想要的吗?为什么不创建一个包含它们共同函数的第三个命名空间呢?

1
我不想通过过多的抽象层次等方式来“过度设计”一个简单的项目。一个文件包含了数据、设置和处理所需的一切。我想将其作为 Web 服务的一部分使用。但是在桌面调试时,我使用简单的可视化工具,它从主脚本中读取设置,但提供了一个单独的函数来显示这个东西在屏幕上。谢谢。 - Fedor Rusak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接