clojure - 如何在函数-main中要求命名空间?

标签 clojure namespaces

假设在 Leiningen 项目哟,我有这些文件:

foo.clj:

(ns yo.foo)
(def x 234.5)

bar.clj:

(ns yo.bar)
(def x -15)

我有一个主文件(core.clj):

(ns yo.core)
(require '[yo.foo :as f])
(when (= f/x 234.5) (println "Succesfully required foo."))
(defn -main [& args]
  (println (require '[yo.bar :as b]))
  ;(when (= b/x -15) (println "Succesfully required bar."))
 )

当我在命令行上输入“lein run”时,我得到以下输出:

Succesfully required foo.
nil

第一行告诉我,我了解如何在文件顶层使用 require 函数。 (通常我会在 ns 语句中使用 :require。)第二行似乎表明我成功要求了 yo.bar

但是,当我取消注释 -main 中包含 when 的行时,出现异常: java.lang.RuntimeException:没有这样的命名空间:b,编译:(yo/core.clj:6:9)

有没有办法从函数内部执行 require ?我的目标是在命令行上传递命名空间的名称,并最终加载该命名空间。还有其他方法可以做到这一点吗? (我已经知道如何从 -main 中访问命令行参数。)

(问题不在于我用 println 包装了 require 调用。如果 -main 的第一行,我会得到相同的异常仅表示 (require '[yo.bar :as b]).)

(this question的标题看起来好像和我的一样,但问题和答案并没有解决从函数内部需要命名空间的问题。)

最佳答案

编译期间不会调用函数-main 中的require 语句。因此编译器无法解析命名空间 b 并发出提示。

关于clojure - 如何在函数-main中要求命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26366251/

相关文章:

c++ - 使用命名空间与使用命名空间闭包的范围

javascript - 使用 xml.setNamespace() 时不添加 namespace

c++ - 将结构放入匿名命名空间有什么作用?

R包: Rstudio possibly generating bad NAMESPACE file

testing - clojure.test 无法解析来自 `eval` 的符号。适用于 REPL 和 lein run

Clojure - Ring uberjar 指定端口

clojure - 吐口水时内存不足

c# - Visual Studio 2012 不生成命名空间

clojure - Scheme中引用的符号

python - Clojure - 进行动态嵌套循环的惯用方法