就像这个问题一样简单,我似乎无法找到同一目录中不同命名空间的正确方法来有效地相互引用。我有两个文件:
project_root/src/babbler/core.clj
:
(ns babbler.core
(:gen-class)
(use '[clojure.string :only (join split)]))
(defn foo [] "Foo")
然后project_root/src/babbler/bar.clj
:
(ns babbler.bar)
(use [babbler.core :as babble])
此文件还包含一个main方法,该方法在我的project.clj
中通过:main babbler.bar
我的整个结构是逆时针生成的,带有默认的leiningen模板。
运行lein repl
的结果是:
Exception in thread "main" java.lang.ClassNotFoundException: babbler.core, compiling:(babbler/bar.clj:3:1)
at clojure.lang.Compiler.analyze(Compiler.java:6380)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$VectorExpr.parse(Compiler.java:3024)
at clojure.lang.Compiler.analyze(Compiler.java:6363)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
(...)
答案 0 :(得分:3)
您的use
应该在命名空间的定义中:
(ns babbler.bar
(use [babbler.core :as babble]))
实际上不鼓励use
,你可能想把它写成:
(ns babbler.bar
(:require [babbler.core :as babble :refer [foo]]))
这样你就可以将babbler.core命名空间中的任何函数f调用为babble / f,你可以直接调用foo。此外,您的文件包含有关foo来自何处的信息,因此您或其他人无需搜索它。