【问题标题】:absence of clojure.core in non-default namespaces within lein repllein repl 中的非默认命名空间中没有 clojure.core
【发布时间】: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 ...)),即根本不费心切换到另一个命名空间。至少这没有意外。

标签: clojure leiningen


【解决方案1】:

在 ClojureDocs.org 中查看这两个参考资料:

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

还有一个不错的blog posting by 8thlight。您还应该确保阅读How to ns


示例

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

~/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

所以上面显示了问题,clojure.core 没有被in-ns 引用到 ns 中。

或者,只需使用ns

~/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

【讨论】:

  • 谢谢,但我认为这还不能真正回答问题
  • 哦,谢谢!当您第一次提到使用ns 时,我并没有意识到要在repl 中实际输入它;我只认为它是 src 文件中的东西。
猜你喜欢
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 2018-12-20
相关资源
最近更新 更多