切换命名空间时保留变量

时间:2015-03-02 15:28:27

标签: clojure namespaces

我正在使用以下剪辑来创建命名空间,将当前命名空间中给定的符号列表及其值注入新命名空间并切换到新命名空间:

(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))))

是否有现成的机制来实现这一目标?由于在脚本上下文中的使用,当前(初始)命名空间是静态未知的,所以我不能静态地引用它。

2 个答案:

答案 0 :(得分:1)

您可以将aliasrefer与运行时*ns*的捕获符号一起使用,而不是创建指向旧var值的新var,以使新绑定可见创建名称空间。

user=> ((juxt identity type) (.name *ns*))
[user clojure.lang.Symbol]

答案 1 :(得分:1)

potemkin库中的import-vars函数可以为您执行此操作(使用*ns*引用原始命名空间后)。