【发布时间】:2013-07-04 12:43:37
【问题描述】:
我正在使用 Clojure 编写一个小型测试框架。
(ns pvt.core.runner
(use
[pvt.tests.deployment]
[pvt.tests.files]
[pvt.tests.jms]))
(defn- run-test
[test-name]
{test-name (test-and-log test-name)})
(defn- run-all-tests-in-namespace
[namespace-name]
(map
run-test
(vals (ns-publics (symbol namespace-name))))
)
(defn run-all-tests
[namespace-list]
(map run-all-tests-in-namespace namespace-list))
我的run-all-tests 函数接受 clojure 脚本列表,加载这些脚本中的所有公共函数并运行它们。这很棒,只是我必须实际导入这些脚本。我将我的函数称为(run-all-tests ["pvt.tests.deployment" "pvt.tests.files" "pvt.tests.jms"]),但这仅在我导入代码摘录开头所见的每个脚本时才有效。这不行,因为我不知道谁会调用 run-all-tests,以及将使用什么参数。
我想知道是否有办法在运行时导入这些脚本。我已经知道每个脚本的名称空间,所以我拥有所有必需的信息。这可以做到吗? 谢谢
【问题讨论】:
-
命名空间是一等公民。我不明白你的问题是什么。请参阅:clojure.org/namespaces 和 clojure.github.io/clojure/clojure.core-api.html#clojure.core/…
-
好吧,命名空间是一等公民,但是对于初学者来说,完成 sebi 所需的技术可能并不那么明显。请适当地查看我的回答和评论(尤其是关于我如何映射和过滤命名空间的任何反馈)。
-
您的回答非常好且全面,但是我猜想所需要的只是在函数内部调用 (use ...) 。 OP 的回答证实了这种情况。
-
1)
use现在被广泛劝阻。 2)“这仅在我导入代码摘录开头所见的每个脚本时才有效。这不好......” - OP不想在源代码中硬编码命名空间名称,这就是我回答了。
标签: reflection import clojure namespaces runtime