gpt4 book ai didi

clojure - 获取调用表单的 namespace

转载 作者:行者123 更新时间:2023-12-02 16:07:28 26 4
gpt4 key购买 nike

我想要一个宏this-ns,以便它返回调用它的位置的 namespace 。例如,如果我有这段代码

(ns nstest.main
(:require [nstest.core :as nstest]))

(defn ns-str [x]
(-> x (.getName) name))

(defn -main [& args]
(println "The ns according to *ns*:" (ns-str *ns*))
(println "The actual ns:" (ns-str (nstest/this-ns))))

我希望调用 lein run 会产生以下输出:

The ns according to *ns*: user
The actual ns: nstest.main

我想出的实现是以下代码:

(ns nstest.core)

(defmacro this-ns []
(let [s (gensym)]
`(do (def ~s)
(-> (var ~s)
(.ns)))))

它似乎确实有效,但感觉很hacky。值得注意的是,在上面的示例中,它将扩展为在 -main 函数内调用 def,这感觉不太干净。

我的问题:是否有更好的方法来实现 this-ns 来获取调用 this-ns 的命名空间?

最佳答案

这是另一种变体:

(defmacro this-ns []
`(->> (fn []) str (re-find #"^.*?(?=\$|$)") symbol find-ns))

事情是匿名函数被编译成一个名为类似的类playground.core$_main$fn__181@27a0a5a2,因此它以函数编译所在的实际命名空间的名称开头。

不能说它看起来比你的变体更简单,但它仍然避免了由 def 在你的情况下引入的副作用。

关于clojure - 获取调用表单的 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56102766/

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