我是一个Clojure新手,REPL中的东西让我很困惑 .
我有一个名为“misc”的项目和一个名为“misc / src / counter_window.clj”的命名空间 . 当我从项目根文件夹输入REPL时,我想导入counter_window的函数,但我似乎每次都要经历以下奇怪的探戈:
user=> (use 'counter-window)
FileNotFoundException Could not locate counter_window__init.class or counter_window.clj on classpath. Please check that namespaces with dashes use underscores in the Clojure file name. clojure.lang.RT.load (RT.java:449)
user=> (use 'misc.counter-window)
CompilerException java.lang.Exception: namespace 'misc.counter-window' not found after loading '/misc/counter_window', compiling:(/tmp/form-init2530455467319465680.clj:1:1)
user=> (use 'counter-window)
nil ;; the import succeeds this third time.
FileNotFound异常中的警告似乎不适用,因为命名空间在counter_window.clj文件中已经被称为 counter-window
.
那么为什么会这样呢?为什么导入不是第一次工作,而是第三次成功?
1 回答
我认为文件路径和命名空间之间存在直接关系 . 文件
src/counter_window.clj
应该具有名称空间声明(ns counter-window)
.应在文件
src/misc/counter_window.clj
中定义名称空间misc.counter-window
. 即它的形式为(ns misc.counter-window)
. 请注意misc
是src
内的文件夹 . 您的项目可以命名为任何名称,我认为它不会影响命名空间 .假设您想要的是命名空间
misc.counter-window
,并且您的文件相应地位于src/misc/counter_window.clj
,以下工作在repl中