关于leiningen:lein repl的非默认名称空间中不存在clojure.core

absence of clojure.core in non-default namespaces within lein repl

在一次莱恩代表中,每当我这样做

1
(in-ns 'some-namespace-other-than-name.core)

clojure.core默认情况下不包括在内。

为了说明,起初我发现自己被这样的事情抓住了

1
2
3
4
5
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

我刚刚找到了解决方法:

1
2
3
4
db.seed=> (clojure.core/use 'clojure.core)
nil
db.seed=> (use 'environ.core)
nil

我的问题是,clojure.core似乎自动包含在名称空间myapp.core中,但没有包含在我可能会在REPL中切换到的任何其他名称空间中。
(但是,很明显,当我从核心名称空间运行程序时,那些名称空间确实可以访问clojure.core。)

那只是莱宁根的默认值吗?

想知道我在这里缺少什么理解或用法。

是因为在运行程序时,只有myapp.core才需要访问clojure.core,而您的.core将使用的命名空间本身也不需要访问clojure.core,因为在执行时,它们只是导入进入您应用程式的.core?因此,切换到其他名称空间来运行事物本质上是人为的吗?

我查看了project.clj中:main键的文档,但找不到答案。


请参阅ClojureDocs.org中的以下两个参考:

  • https://clojuredocs.org/clojure.core/in-ns
  • https://clojuredocs.org/clojure.core/ns

我认为只使用ns会更容易。

8thlight也发布了不错的博客文章。您还应该确保阅读How to ns。

示例

假设我有一个主ns demo.core和一个测试ns tst.demo.core。我从REPL访问:

1
2
3
4
5
6
~/expr/demo > lein repl
demo.core=> (in-ns 'tst.demo.core)
#object[clojure.lang.Namespace 0x6a2b14a1"tst.demo.core"]
tst.demo.core=> (use 'demo.core)
Syntax error compiling at (/tmp/form-init10207825906790622351.clj:1:1).
Unable to resolve symbol: use in this context

因此上面显示了一个问题,in-ns没有将clojure.core引用到ns中。

或者,只需使用ns

1
2
3
4
5
~/expr/demo > lein repl
demo.core=> (ns tst.demo.core)       ; note absence of single-quote!
nil
tst.demo.core=> (use 'demo.core)     ; all clojure.core is automatically refered
nil