Какая функция / макрос для проверки того, какие пространства имен в настоящее время «используются» и как проверить, используется ли одно из них? - PullRequest
2 голосов
/ 20 октября 2011

Есть ли в Clojure функция / макрос для проверки того, какие пространства имен в настоящее время 'используются' ? Который из? Поэтому я не имею в виду «в каком пространстве имен мы находимся в настоящее время», но, например, я хочу выяснить, используется ли «clojure.contrib.string» в настоящее время «как» в (use 'clojure.contrib.string). Я не имею в виду «требуется».

Как написать функцию, которая дает true, когда, например, 'clojure.contrib.string (имя пространства имен, предоставляемое через символ), используется и false в противном случае? (defn ns-used? [имя] (...)

Ответы [ 2 ]

1 голос
/ 20 октября 2011

all-ns , как предложено kotarak, близко к тому, что вы ищете, но оно также дает вам все пространства имен, которые были required без ссылки.

В противном случае ns-Refer дает вам карту всех функций, которые упоминаются в пространстве имен.Сходными и, возможно, также интересными являются ns-map и ns-import , которые дают вам отображение всех импортированных классов или записей.

Если вы хотите строго найти все пространства имен, из которых были переданы функции, вы можете сделать что-то вроде этого:

(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)
0 голосов
/ 20 октября 2011

all-ns для некоторого подходящего определения «используется».

ns-относится к другому определению «используется».

...