我有一个问题,现在它已经消失,我知道是什么修复它但我不明白为什么 . 我对clojure很新,但在我看来,一些命名空间名称将不起作用,我并不意味着已经被另一个符号占据的明显名称 .

我有一个相当简单的项目来实现调度程序,它有三个名称空间:schedule.core,schedule.jdate和schedule.validation .

验证名称空间有效,但对于jdate名称空间,我总是收到如下错误:

CompilerException java.lang.Exception:No namespace:schedule.jdate,compiling:(schedule / core.clj:1:1)

根据我目前试图解决问题的方式,错误略有不同,但基本上总是意味着相同的:没有名称空间的命名空间,在一个例子中,错误甚至表示没有jdate__init(我可以相信) )和没有jdate.clj,虽然文件就在文件夹中 .

我的命名空间声明和包含看起来像这样:

src/schedule/core.clj: 
(ns schedule.core
  (:gen-class)
  (:require schedule.jdate)
  (:refer schedule.jdate)
  (:require schedule.validation)
  (:refer schedule.validation))

src/schedule/jdate.clj:
(ns schedule.jdate
  (:gen-class)
  (:import java.util.Date)
  (:import java.util.Calendar))

src/schedule/validation.clj: 
(ns schedule.validation
  (:gen-class))

正如我所说,验证命名空间没有问题 . 最终我用完了想法并开始尝试那些不可能有任何关系的东西,除其他外我将jdate命名空间重命名为scheduate . 行为没有变化 .

再过一段时间,我得到了“我甚至不再尝试”的阶段,我将jdate命名空间重命名为“murks”(瑞士语中的一句话,表达了“我需要更大的锤子才能工作”) )并且...它有效 . 我认为代码中的其他地方一定有某些东西,我不经意地改变了,突然之间就让它发挥了作用 . 所以我把名字改回了jdate . 它立即停止工作 .

最后,我有点困惑 . 可以在这里有人告诉我)为什么前两个名字没有b)以扩展是什么名称保存到使用的命名空间,工作,第三个做的,因为我没有期待打扫雷艇时的感觉在将来命名它们 .

编辑:似乎问题源于多个密谋来源 . 首先,我的代码结构需要两个名称空间的双向依赖关系 . 由于我不太熟悉Clojure的工作原理,所以我假设了一个c风格的包含层次结构,后面包含在同一个树中的文件包含了所有包含它们的内容 . 我对收到的错误的性质感到有些惊讶,但话说回来,我现在应该知道Clojure错误消息几乎是难以理解的,并且往往具有很强的误导性 . 不一致的行为似乎源于我疯狂地尝试重新加载不同的命名空间而不关闭其间的REPL ...即,REPL操作的结果并不总是反映代码的状态 .

哦,那是“Clojure真的讨厌循环包含”这个相当乏味的课程,但我认为这是我现在学到的 .