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

时间:2014-10-14 17:01:49

标签: 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函数。 (通常我会在:require语句中使用ns。)第二行似乎表明我已成功要求yo.bar

但是,当我取消注释when中包含-main的行时,我会收到异常: java.lang.RuntimeException: No such namespace: b, compiling:(yo/core.clj:6:9)

有没有办法在函数内部执行require?我的目标是在命令行上传递命名空间的名称,并将该命名空间作为结果加载。还有另一种方法吗? (我已经知道如何从-main内访问命令行参数。)

(问题不在于我使用require打包了println。如果-main的第一行仅显示(require '[yo.bar :as b]),我会得到相同的例外。)< / p>

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

1 个答案:

答案 0 :(得分:1)

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