clojure - 切换命名空间时保留变量

标签 clojure namespaces

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

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

是否有实现这一目标的现有机制?由于在脚本上下文中的使用,当前(初始)命名空间是静态未知的,因此我无法静态引用它。

最佳答案

您可以使用 alias,而不是创建一个指向旧 var 值的新 var。或 refer使用捕获的运行时符号 *ns*使绑定(bind)在新创建的命名空间中可见。

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

关于clojure - 切换命名空间时保留变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28813432/

相关文章:

python - 列出python命名空间中的所有元素

Clojure.test 抛出?不在 repl 中工作

php - Laravel 和命名空间

clojure - 调用 `(get-thread-binding)`会导致堆栈溢出

json - 如何选择Clojure JSON库

php - 是否可以根据 PHP 中的命名空间自动加载文件?

c++ - 为什么 C++ 参数作用域会影响命名空间内的函数查找?

asp.net-mvc - 向 ASP.NET MVC 3 View 添加命名空间

loops - 这两个 Clojure 代码块有什么区别?

java - 给定增益、频率和 q,如何绘制准确的参数均衡曲线?