2011-10-20 25 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,增加了一個子問題 –

相關問題