2010-04-30 4 views
51

Я хотел бы знать, как перечислить все функции пространства имен Clojure. Я провел какое-то исследование, но я еще не пришел. Я уже узнал, как список методов класса Java с помощью метода шоу:Как перечислить функции пространства имен?

(show java.awt.Graphics) 

Чтобы перечислить функции имен Clojure Я пробовал метод показать, как это:

(show 'clojure.contrib.repl-utils) 

Это показывает некоторые методы класса Java, но не те, которые я ищу, как doc и show. Как я могу получить их?

ответ

75

Я обычно называю

(keys (ns-publics 'foo)) 

в список Vars экспортированного пространства имен foo; например для clojure.contrib.monads это возвращает

(defmonad censor m-when-not m+write+m maybe-m maybe-t ...) 

... стенды для довольно много больше).

В более общем плане, есть куча функций, чьи имена начинаются в ns-, список которых Vars по пространству имен, с некоторыми дополнительными критериями, прикрепленные:

  1. ns-map - наиболее общая функция всех, возвращает карту заклиненной по символам (фактически не принадлежащим к пространству имен символам), где значение, соответствующее каждому символу, является Var или классом, который разрешает символ в данном пространстве имен.

  2. ns-interns - как ns-map, но включает в себя только Варс интернированные в заданном пространстве имен (в отличие от Vars из других пространств имен, которые доступны из заданного пространства имен из-за use или refer вызова или неявной передаче от Vars . clojure.core

  3. ns-publics - как ns-interns, но включает в себя только не-частное Варс

  4. ns-imports. - как ns-map, но включает в себя только записи Wh Значения ose соответствуют классам Java.

Там также ns-aliases который перечисляет символы, которые могут быть использованы в качестве сокращённых псевдонимов при обращении к Варс из других пространств имен; например если вы вызываете (require '[clojure.contrib.math :as math]), ns-aliases будет содержать запись с ключом math (символ), значением которой будет фактическое пространство имен clojure.contrib.math. Эти сопоставления не включены в карту, возвращаемую ns-map.

+0

Является ли доступность этих функций и функция 'doc' причиной того, что предоставление документации для старых библиотек и других пакетов не является особенно высоким приоритетом? –

6

Посмотрите here. Более конкретно:

;; Sometimes I like to ask which public functions a namespace provides. 
(defn- ns-publics-list [ns] (#(list (ns-name %) (map first (ns-publics %))) ns)) 
47

Вы можете использовать dir. (Возможно, это было невозможно, когда вопрос был задан первым.)

user=> (dir clojure.string) 
blank? 
capitalize 
escape 
join 
lower-case 
re-quote-replacement 
replace 
replace-first 
reverse 
split 
split-lines 
trim 
trim-newline 
triml 
trimr 
upper-case 
nil 
+0

отметить: как-то в clojure 1.4 '(dir * ns *)' не работает, 'Исключение Нет пространства имен: * ns * найдено clojure.core/the-ns (core.clj: 3691)' – xealits

+1

@xeslits, I ' Конечно, ты прав. Если в моем ответе вы ссылаетесь на документацию 'dir', в одном углу указывается, что в Clojure 1.6 введено' dir'. В то время, когда я отправил ответ, возможно, я должен был включить эту информацию. На данный момент, v. 1.5 - это уже три версии за текущей версией. Хотя могут быть люди, у которых есть веские причины использовать 1,5 или даже 1,4, я думаю, что эти случаи встречаются редко. – Mars

+2

@xealits @Mars Это не имеет ничего общего с версией. Вам просто нужно предоставить фактический символ пространства имен: '(dir my-actual-namespace)' отлично работает в Clojure 1.8, пока я получаю ошибку 'No namespace: * ns *', если я пытаюсь '(dir * ns *) '. –

0

Для тех, кто использует против часовой стрелки, есть «браузер пространства имен», который отображается по умолчанию.

Если не видно, можно показать с помощью опции меню:

Window> Show View> Пространство имен браузера

Официальная документация: http://doc.ccw-ide.org/documentation.html#_namespace_browser_view

Выдержка из официальной документации:

Просмотр обозревателя пространства имен отображает все символы всех пространств имен активных REPL. [2]. Он позволяет перейти к определению символов в соответствующих файлах (включая внутренние банки): только дважды щелкните по имени символа в окне просмотра пространства имен.

Смежные вопросы