2011-10-20 29 views
2

在Clojure中是否有函数/宏来检查当前的命名空间是'used'?哪一个?所以我并不是说'我们目前在使用什么命名空间',但是例如,我想知道'clojure.contrib.string'是否当前被'使用',如(use 'clojure.contrib.string)。我不是说'必需的'。什么函数/宏来检查当前“使用”了哪些名称空间以及如何检查是否使用了特定名称空间?

一个人如何写在使用假例如“clojure.contrib.string(通过符号提供的命名空间的名称),否则,让真正的功能? (DEFN NS-使用?[名称](...)

回答

1

all-ns所建议通过kotarak,接近你正在寻找的东西,但它也给你所有的名字空间已被required未被引用。

否则ns-refers给你一个名称空间中引用的所有函数的映射。西米lar并且可能还感兴趣的是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)))) 

如果你是幸福的,以检查是否命名空间已经requiredused你可以不要

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

你将不得不通过符号引用:

(ns-used? 'clojure.core) 
+1

tnx,增加了一个子问题 –

+0

@MichielBorkent我做了一些挖掘工作,'all-ns'实际上也给了你所有'required'命名空间。查看我的答案,找到一个解决方案,以获取所有函数已被引用的所有命名空间(如使用命名空间的情况)。 – Paul

+0

好的,有没有办法得到使用过的? –

0

all-ns关于 '使用' 的一些合适的定义。

ns-refers关于 '使用' 的一些其它的定义。

+0

tnx,增加了一个子问题 –

相关问题