我正在使用以下剪辑来创建命名空间,将当前命名空间中给定的符号列表及其值注入新命名空间并切换到新命名空间:
(defn in-ns-with-vars
"Switch to a new namespace (creating it if necessary) and
inject the given symbols into the new namespace
with the values they resolve to in the current namespace."
[new-ns-symbol & symbols-to-inject]
(let [n (create-ns new-ns-symbol)
current-value-of (fn [v] @(ns-resolve (the-ns *ns*) v))]
(do
(doseq [v symbols-to-inject]
(intern new-ns-symbol v (current-value-of v)))
(in-ns new-ns-symbol)
(clojure.core/refer 'clojure.core))))
是否有现成的机制来实现这一目标?由于在脚本上下文中的使用,当前(初始)命名空间是静态未知的,所以我不能静态地引用它。
答案 0 :(得分:1)
您可以将alias
或refer
与运行时*ns*
的捕获符号一起使用,而不是创建指向旧var值的新var,以使新绑定可见创建名称空间。
user=> ((juxt identity type) (.name *ns*))
[user clojure.lang.Symbol]
答案 1 :(得分:1)
potemkin库中的import-vars
函数可以为您执行此操作(使用*ns*
引用原始命名空间后)。