什么函数/宏来检查当前“使用”的命名空间以及如何检查是否使用了特定的命名空间?

时间:2011-10-20 09:38:46

标签: namespaces clojure

Clojure中是否有函数/宏来检查当前'used'的命名空间?哪一个?所以我并不是说'我们目前在哪个命名空间',但是例如,我想知道'{1}}中'clojure.contrib.string'当前是否已被'使用'。我的意思并不是“必需”。

当使用'clojure.contrib.string(通过符号提供的命名空间的名称)时,如何编写一个给出true的函数,否则为false? (defn ns-used?[name](...)

2 个答案:

答案 0 :(得分:1)

kotarak建议的

all-ns接近您所寻找的内容,但它也为您提供了required未被引用的所有名称空间。

否则ns-refers会为您提供命名空间中引用的所有函数的映射。类似的,也可能是感兴趣的是ns-mapns-imports,它们为您提供了所有导入的类或记录的映射。

如果要严格查找已引用函数的所有命名空间,可以执行以下操作:

(defn ns-used? [ns]
  (let [referred-namespaces (set (map (fn [[k v]] (:ns (meta v))) (ns-refers *ns*)))] 
    (contains? referred-namespaces (find-ns ns))))

如果您愿意检查命名空间是required还是used,那么

(defn ns-used-or-required? [ns]
  (contains? (set (all-ns)) (find-ns ns)))

您必须在引号中传递符号:

(ns-used? 'clojure.core)

答案 1 :(得分:0)

all-ns对'used'的某些合适定义。

ns-refers用于'used'的其他定义。