(对不起,这么长。排除误解,不是因为我想让你弄清楚我的问题应该是什么。)
我了解 Clojure 命名空间的基础知识,并且我ns
在文件开头的语句中列出的命名空间必须与目录层次结构中文件的位置相匹配。我已经弄清楚了 Leiningen 自动设置搜索load
的部分内容,以及自动加载的部分内容,但是......它仍然让我发疯。问题是 Leiningen 似乎隐含地设置了一些东西,在Leiningen 教程和示例项目文件等明显的地方也没有很好地记录。(也许信息在那里,但我还没有找到/解释它。)
我已经设置好了,所以当我这样做时lein repl
,会加载主要源文件(下面的 popco.clj 和 acme.clj),但加载其他文件会导致麻烦。我想让 MWE 尽可能小,并且问题简短,但我想明确表示我不是在问已经回答过的更简单的问题(例如这个)。
这是源文件所在的位置,ns
右侧列出了来自相同文件的语句:
src/popco/sims/sim1/sim1propns.clj (ns popco.sims.sim1.sim1propns)
src/utils/general.clj (ns utils.general)
src/popco/core/acme.clj (ns popco.core.acme)
src/popco/core/popco.clj (ns popco.core.popco
[:use popco.core.acme]
[:import [popco.core.acme Propn Obj]]
(:gen-class)) ; not sure what this does yet
这是 project.clj 文件:
(defproject popco-x "0.0.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.5.1"]]
:main popco.core.popco
:profiles {:dev {:dependencies []
:source-paths ["src"] }})
当我运行时lein repl
,我看到我在popco.core.popco
命名空间中:
popco.core.popco=>
而且我发现 acme.clj 中定义的函数和记录类型都可用。我已经(通过反复试验)了解到:main popco.core.popco
project.clj 中的“”导致 popco.clj 运行,这导致 REPL 留在popco.core.popco
命名空间中。到现在为止还挺好。
以下是我的问题:
如果我想加载 src/utils/general.clj 或 src/popco/sims/sim1/sim1propns.clj 怎么办?我可以用 加载它们load-file
,但我想load
在 REPL 中使用,更重要的是,我希望能够从其他源文件require
或use
这些源文件。例如,如何从 acme.clj 中引用 general.clj 中的函数?我认为答案可能是:source-paths
在 project.clj 之后向序列中添加条目,但我对应该去那里的内容感到困惑。
随意推荐任何东西。其他目录结构,对 project.clj 的根本更改,等等。