【问题标题】:How to get the namespace of a var in Clojure?如何在 Clojure 中获取 var 的命名空间?
【发布时间】:2017-08-11 18:38:50
【问题描述】:

我目前正在使用以下 工作 - 但它似乎有点混乱

(defn get-namespace
  [qualified-var]
  {:pre [(var? qualified-var)]}
  (the-ns
   (symbol
    (apply str (drop 2 (first (str/split (str qualified-var) #"/")))))))

忽略丑陋的字符串拆分(又快又脏),是否有内置功能可以做到这一点?

【问题讨论】:

  • 试试(-> qualified-var meta :ns)
  • 你想把它写成一个回答 :D 还是我应该删除这个问题?
  • 似乎很有用的问答,要么让@ez121sl 回答并接受,要么自己回答并接受
  • 这个问题很好。我稍后会写下答案,或者其他人会在此期间完成。

标签: clojure namespaces


【解决方案1】:

var 的元数据在 :ns 键下包含对其命名空间的引用。那将是定义 var 的命名空间。可以使用 meta 函数访问 var 的元数据。综上所述,我们得到(-> some-var meta :ns),我们可以进行一些实验:

(def x "foo")
;; #'user/x
(-> #'x meta :ns)
;; #object[clojure.lang.Namespace 0x396bcdb0 "user"]
(-> #'clojure.core/map meta :ns)
;; #object[clojure.lang.Namespace 0x28412381 "clojure.core"]

一个完整的例子可能如下所示:

(defn var-namespace
  [qualified-var]
  {:pre [(var? qualified-var)]}
  (-> qualified-var meta :ns))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多