2010-04-30 19 views
51

Mi piacerebbe sapere come elencare tutte le funzioni di uno spazio dei nomi Clojure. Ho fatto delle ricerche ma non ci sono ancora. Ho già trovato il modo di elencare i metodi di una classe Java utilizzando il metodo show:Come elencare le funzioni di un namespace?

(show java.awt.Graphics) 

Per elencare le funzioni di un namespace Clojure Ho provato il metodo show come questo:

(show 'clojure.contrib.repl-utils) 

Questo mostra alcuni metodi di classe Java, ma non quelli che sto cercando come doc e show. Come posso ottenere quelli?

risposta

75

Io di solito chiamo

(keys (ns-publics 'foo)) 

per elencare Vars esportato dallo spazio dei nomi foo; per esempio. per clojure.contrib.monads restituisce

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

(i ... sta per un bel po 'di più).

Più in generale, c'è un sacco di funzioni il cui nome inizia in ns- quale lista Vars dal namespace, con determinati criteri aggiuntivi collegati:

  1. ns-map - la funzione più generale di tutti, restituisce una mappa digitato per simboli (in realtà simboli non classificati nello spazio dei nomi), dove il valore corrispondente a ciascun simbolo è il Var o la classe a cui il simbolo si risolve nello spazio dei nomi specificato.

  2. ns-interns - come ns-map, ma include solo il Vars internati in un determinato spazio dei nomi (al contrario di Vars da altri spazi dei nomi che sono accessibili dalla data namespace a causa di una chiamata o di userefer o il rinvio implicito Vars . clojure.core

  3. ns-publics - come ns-interns, ma include solo il Vars non privato

  4. ns-imports -. come ns-map, ma include solo le voci wh i valori di ose corrispondono alle classi Java.

C'è anche ns-aliases che elenca i simboli che possono essere utilizzati come alias di stenografia quando si parla di Vars da altri nomi; per esempio. se si chiama (require '[clojure.contrib.math :as math]), ns-aliases includerà una voce con la chiave di math (il simbolo), il cui valore sarà lo spazio dei nomi effettivo clojure.contrib.math. Queste mappature non sono incluse nella mappa restituita da ns-map.

+0

La disponibilità di queste funzioni e la funzione 'doc' sono un motivo per cui fornire documentazione per vecchie librerie e altri pacchetti non è una priorità particolarmente elevata? –

6

Dai uno sguardo allo here. Più in particolare:

;; 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

È possibile utilizzare dir. (Forse questo non era disponibile quando la domanda è stata posta per prima.)

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

notando: in qualche modo in clojure 1.4 '(dir * ns *)' non funziona, 'Eccezione Nessuno spazio dei nomi: * ns * trovato clojure.core/the-ns (core.clj: 3691)' – xealits

+1

@xeslits, I ' sono sicuro che tu abbia ragione Se segui il link alla documentazione 'dir' nella mia risposta, c'è un avviso in un angolo che indica che' dir' è stato introdotto in Clojure 1.6. Nel momento in cui ho postato la risposta, forse avrei dovuto includere quell'informazione. A questo punto, v. 1.5 sono già tre versioni dietro la versione corrente. Sebbene ci possano essere persone che hanno buone ragioni per usare 1.5 o anche 1.4, penso che questi casi siano rari. – Mars

+2

@xealits @Mars Questo non ha nulla a che fare con la versione. Hai solo bisogno di fornire il vero simbolo del namespace: '(dir my-actual-namespace)' funziona bene in Clojure 1.8 mentre ottengo l'errore 'No namespace: * ns *' se provo '(dir * ns *) '. –

0

Per coloro che utilizzano in senso antiorario, esiste un "Namespace Browser" che viene visualizzato per impostazione predefinita.

Se non è visibile, si può dimostrare opzione di menu tramite:

Finestra> Mostra vista> Namespace Browser

documentazione ufficiale: http://doc.ccw-ide.org/documentation.html#_namespace_browser_view

Estratto dalla documentazione ufficiale:

Il Namespace Browser View visualizza tutti i simboli di tutti i namespace di REPL attivo. [2]. Ti consente di passare alla definizione dei simboli nei file pertinenti (inclusi i barattoli interni): solo fai doppio clic sul nome del simbolo nella vista del browser Namespace.

Problemi correlati