gpt4 book ai didi

clojure - 从不同的命名空间运行嵌入代码

转载 作者:行者123 更新时间:2023-12-02 18:41:32 25 4
gpt4 key购买 nike

我经常想在另一个命名空间中运行一小段代码 - 例如,可能是 DSL 代码的复制/粘贴片段,并且我希望避免:

  • 将一堆 use 子句添加到我当前的命名空间声明中。这使得 ns 声明变得困惑,增加了额外的维护工作,有时还存在名称冲突的风险。
  • 添加 require 子句,并强制为所有内容添加命名空间限定符或别名。现在我的 DSL 代码更加困惑。

理想情况下,我希望能够执行以下操作:

(with-ns my.namespace
(foo bar baz))

其中 foobar 可能是 my.namespace 中的符号,但 baz 是当前(封闭)命名空间。因此,代码在类似于“本地”命名空间的东西中运行,该命名空间在其范围内“使用”my-namespace,但不会影响周围的命名空间。

是否有标准/更好的方法来做到这一点?或者这是一件疯狂的事情?

最佳答案

试试这个:

(defmacro with-ns [[namespace symbols] & body]
`(do (use '[~namespace :only ~symbols])
(let [result# (do ~@body)]
(doseq [sym# (map #(:name (meta (val %)))
(filter #(= (name '~namespace)
(str (:ns (meta (val %)))))
(ns-refers *ns*)))]
(ns-unmap *ns* sym#))
result#)))

(with-ns [clojure.string [split upper-case]]
(split (upper-case "it works!") #" "))
-> ["IT" "WORKS!"]

工作结束后,它会从当前 ns 中删除使用过的符号。

关于clojure - 从不同的命名空间运行嵌入代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13752821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com