【发布时间】:2020-03-06 16:18:48
【问题描述】:
在 lein repl 中,每当我这样做时
(in-ns 'some-namespace-other-than-name.core)
clojure.core 默认不包含。
为了解释,最初我发现自己被这样抓住了
db.core=> (in-ns 'db.seed)
#object[clojure.lang.Namespace 0x12738ef5 "db.seed"]
db.seed=> (use 'environ.core)
Syntax error compiling at (form-init7774277424301430706.clj:1:1).
Unable to resolve symbol: use in this context
我刚刚找到了解决方法:
db.seed=> (clojure.core/use 'clojure.core)
nil
db.seed=> (use 'environ.core)
nil
我的问题是,clojure.core 似乎自动包含在命名空间 myapp.core 中,但没有包含在我可能会在 repl 中切换到的任何其他命名空间中。 (然而,当我从核心命名空间运行程序时,显然那些命名空间确实可以访问 clojure.core)。
这只是 leiningen 的默认设置吗?
想知道我在这里缺少什么理解或用法。
是不是当我们运行一个程序时,只有 myapp.core 需要访问 clojure.core,而你的 .core 将使用的命名空间本身不需要访问 clojure.core,因为它们在执行时只是导入进入你的应用程序的.core?因此切换到其他命名空间来运行东西本质上是有点人为的?
我查看了:main key in project.clj 的文档,但找不到答案。
【问题讨论】:
-
还有
refer-clojure,看这里的解释:clojure.org/guides/repl/… -
有趣。因此,在没有核心的命名空间中,发出
(clojure.core/refer-clojure)似乎与发出(clojure.core/use 'clojure.core)具有相似的效果。 -
如果有兴趣的话,我直接在 repl 上使用的方法是像
(require 'db.series :verbose :reload)这样发出来重新加载我一直在处理的文件,然后简单地调用其他函数(现在重新加载)命名空间总是通过完全限定它们,比如(pprint (db.series/app-state ...)),即根本不费心切换到另一个命名空间。至少这没有意外。