【发布时间】:2014-10-14 17:01:48
【问题描述】:
假设在 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: No such namespace: b, compiling:(yo/core.clj:6:9).
有没有办法从函数内部执行请求?我的目标是在命令行上传递命名空间的名称,然后加载该命名空间。还有另一种方法可以做到这一点吗? (我已经知道如何从-main 中访问命令行参数。)
(问题不在于我用println 包装了require 调用。如果-main 的第一行只显示(require '[yo.bar :as b]),我会得到同样的异常。)
(this question 的标题看起来好像和我的一样,但问题和答案并没有解决在函数内部需要命名空间的问题。)
【问题讨论】:
标签: clojure namespaces