假设在 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/