如何访问当前命名空间的名称?

时间:2017-11-28 18:23:12

标签: clojurescript

似乎*ns*对象在Clojure下始终可用,但在ClojureScript下不可用。是否有另一种方法来访问当前名称空间的名称?

动机

我有很多像

这样的电话
(define-subscription ::something :other-namespace/something)

其中something的两次出现是多余的。我希望能够以更简洁的形式编写此代码,例如(define-sub 'something),但为了将缩短的形式转换为完整形式,我需要有一种方法来引用关键字{{1不使用::something句法糖。 只能在命名空间名称中进行硬编码,但这感觉不尽如人意。

1 个答案:

答案 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))))
相关问题