ClojureScript - 无法迭代 ns-unmap 函数

ClojureScript - Failing to iterate over the ns-unmap function

我无法在 ClojureScript 中运行一些在 Clojure 中运行没问题的东西。

(defn unmap [nspace & vars]
  (doseq [var vars] (ns-unmap nspace var)))

用法为:

(unmap 'some.nspace 'vars 'to 'be 'removed)

您还可以取消映射宏,这样就不必引用所有内容。它所做的只是遍历符号列表并从给定的命名空间中提取它们的绑定。

宏形式或取消映射函数在 ClojureScript 中都不起作用(它们在 Clojure 中运行良好)。尝试定义上述函数时出现以下错误。

意外错误 (AssertionError) 宏扩展 cljs。core/ns-unmap。 断言失败:ns-unmap 的参数必须用引号引起来

不确定这是否是错误。看起来 ClojureScript 正在寻找类型提示。如果有人知道如何让它工作,我们将不胜感激。

在 ClojureScript 中,ns-unmap 宏设计用于在 REPL 中操作在开发时实现命名空间时使用的运行时和编译器状态。

传递给 ns-unmap 的符号需要在编译时已知,以便它在宏扩展时正确操作编译器状态。

这个问题可以通过定义一个扩展为 do 的宏来解决,其中包含每个所需的 ns-unmap 调用。

这是一个例子:

(defmacro unmap [nspace & vars]
 `(do
   ~@(map (fn [var] 
           `(ns-unmap ~nspace ~var)) 
      vars)))