似乎*ns*
对象在Clojure下始终可用,但在ClojureScript下不可用。是否有另一种方法来访问当前名称空间的名称?
我有很多像
这样的电话(define-subscription ::something :other-namespace/something)
其中something
的两次出现是多余的。我希望能够以更简洁的形式编写此代码,例如(define-sub 'something)
,但为了将缩短的形式转换为完整形式,我需要有一种方法来引用关键字{{1不使用::something
句法糖。 只能在命名空间名称中进行硬编码,但这感觉不尽如人意。
答案 0 :(得分:1)
您可以阅读与您感兴趣的名称空间的var相关联的元数据:
(defn get-current-namespace []
(-> #'get-current-namespace meta :ns))
或者,如果您不想在命名空间本身中声明此函数,但需要将其作为实用程序方法,则可以创建如下函数:
(defn namespace-of-var [a-var]
(-> a-var meta :ns))
你可以这样称呼:
cljs.user> (def a "hello!")
cljs.user> (namespace-of-var #'a)
cljs.user
实际上,您可以从另一个函数调用namespace-of-var函数,将函数自己的名称作为var参数传递:
(defn function-in-another-namespace []
(let [current-namespace (namespace-of-var #'function-in-another-namespace)]
(prn (str "current namespace: " current-namespace))))