Wie liste ich die Funktionen eines Namespace auf?

73

Ich möchte wissen, wie alle Funktionen eines Clojure-Namespace aufgelistet werden. Ich habe einige Nachforschungen angestellt, bin aber noch nicht da. Ich habe bereits herausgefunden, wie man die Methoden einer Java-Klasse mit der show-Methode auflistet:

(show java.awt.Graphics)

Um die Funktionen eines Clojure-Namespace aufzulisten, habe ich die show-Methode wie folgt ausprobiert:

(show 'clojure.contrib.repl-utils)

Dies zeigt einige Java - Klassen - Methoden, aber nicht die , die ich suche , wie docund show. Wie kann ich die bekommen?

StackedCrooked
quelle

Antworten:

90

Normalerweise rufe ich an

(keys (ns-publics 'foo))

Vars auflisten, die vom Namespace exportiert wurden foo; zB clojure.contrib.monadsdafür kehrt zurück

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

(das ...steht für ziemlich viel mehr).

Im Allgemeinen gibt es eine Reihe von Funktionen, deren Namen in ns-der Liste Vars nach Namespace beginnen, wobei bestimmte zusätzliche Kriterien beigefügt sind:

  1. ns-map - Die allgemeinste Funktion von allen gibt eine Karte zurück, die mit Symbolen versehen ist (eigentlich nicht für den Namespace qualifizierte Symbole), wobei der Wert, der jedem Symbol entspricht, der Var oder die Klasse ist, in die das Symbol im angegebenen Namespace aufgelöst wird.

  2. ns-interns- wie ns-map, aber enthält nur die Vars internierte im gegebenen Namensraum (wie von anderen Namensräumen zu Vars gegenüber, die von dem gegebenen Namensraum zugänglich sind , aufgrund eines useoder referAnruf oder die impliziten Verweisung von Vars aus clojure.core.

  3. ns-publics- wie ns-interns, enthält aber nur die nicht privaten Vars.

  4. ns-imports- wie ns-map, enthält jedoch nur die Einträge, deren Werte Java-Klassen entsprechen.

Es gibt auch ns-aliasesSymbole, die als Kurzform-Aliase verwendet werden können, wenn auf Vars aus anderen Namespaces verwiesen wird. Wenn Sie beispielsweise anrufen (require '[clojure.contrib.math :as math]), ns-aliaseswird ein Eintrag mit dem Schlüssel math(dem Symbol) eingefügt, dessen Wert der tatsächliche Namespace ist clojure.contrib.math. Diese Zuordnung ist nicht in der von zurückgegebenen Zuordnung enthalten ns-map.

Michał Marczyk
quelle
Ist die Verfügbarkeit dieser Funktionen und der docFunktion ein Grund, warum die Bereitstellung von Dokumentation für alte Bibliotheken und andere Pakete keine besonders hohe Priorität hat?
Kenny Evitt
63

Sie können dir verwenden . (Vielleicht war dies nicht verfügbar, als die Frage zum ersten Mal gestellt wurde.)

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
Mars
quelle
1
zu bemerken: irgendwie in clojure 1.4 (dir *ns*)funktioniert nicht,Exception No namespace: *ns* found clojure.core/the-ns (core.clj:3691)
xealits
1
@ xeslits, ich bin sicher du hast recht. Wenn Sie dem Link zur dirDokumentation in meiner Antwort folgen , wird in einer Ecke ein Hinweis dirangezeigt, der darauf hinweist, dass er in Clojure 1.6 eingeführt wurde. Zum Zeitpunkt der Veröffentlichung der Antwort hätte ich diese Informationen möglicherweise einfügen sollen. Zu diesem Zeitpunkt ist Version 1.5 bereits drei Versionen hinter der aktuellen Version. Obwohl es Menschen gibt, die gute Gründe haben, 1,5 oder sogar 1,4 zu verwenden, denke ich, dass diese Fälle selten sind.
Mars
3
@xealits @Mars Das hat nichts mit der Version zu tun. Sie müssen nur das eigentliche Symbol des Namespace angeben: Funktioniert (dir my-actual-namespace)in Clojure 1.8 einwandfrei, während ich den No namespace: *ns*Fehler erhalte , wenn ich es versuche (dir *ns*).
Radon Rosborough
3
Zurück zu dieser Frage und Antwort erneut: Hinweis, dirgibt nur "öffentliche" Vars zurück , ns-mapist für alles.
Xealits
6

Schauen Sie hier . Genauer:

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

Für diejenigen, die gegen den Uhrzeigersinn arbeiten, gibt es einen "Namespace-Browser", der standardmäßig angezeigt wird.

Wenn nicht sichtbar, kann es über die Menüoption angezeigt werden:

Fenster> Ansicht anzeigen> Namespace-Browser

Offizielle Dokumentation: http://doc.ccw-ide.org/documentation.html#_namespace_browser_view

Auszug aus der offiziellen Dokumentation:

In der Namespace-Browseransicht werden alle Symbole aller Namespaces der aktiven REPL angezeigt. [2]. Sie können damit zur Definition von Symbolen in den relevanten Dateien (einschließlich in Gläsern) springen: Doppelklicken Sie einfach auf den Symbolnamen in der Namespace-Browseransicht.

JeffreyGoines
quelle