2011-01-09 17 views
15

Weiß jemand, ob es ein Clojure-Äquivalent für Pythons "dir" gibt. Im Grunde muss ich die Funktionen kennen, die ich für etwas oder spezifisch für Java-Objekte aufrufen kann. Ich möchte die verfügbaren Methoden und Eigenschaften kennen (ich bin mir nicht sicher, ob sie in Java Methoden und Eigenschaften heißen, das ist C# lingo).Python "dir" entspricht in Clojure

Antwort

15

clojure.contrib.repl-utils/show für den Einsatz am REPL:

user=> (use '[clojure.contrib.repl-utils :only (show)]) 
nil 
user=> (show String) 
=== public final java.lang.String === 
[ 0] static CASE_INSENSITIVE_ORDER : Comparator 
[ 1] static copyValueOf : String (char[]) 
[ 2] static copyValueOf : String (char[],int,int) 
[ 3] static format : String (Locale,String,Object[]) 
[ 4] static format : String (String,Object[]) 
... 

Alternativ vielleicht so etwas wie:

user=> (map #(.getName %) (.getMethods String)) 
("equals" "toString" "hashCode" "compareTo" ...) 

.getFields und .getConstructors entsprechend.

8

Der clojure.repl Namespace (die seit Clojure 1.2 verfügbar ist) enthält das Makro dir und die Funktion dir-fn:

user=> (clojure.repl/dir clojure.main) 
load-script 
main 
repl 
... 

user=> (clojure.repl/dir-fn 'clojure.main) 
(load-script main repl repl-caught repl-exception 
repl-prompt repl-read skip-if-eol skip-whitespace 
with-bindings) 
+0

Oh, vermisste ich die Einführung von 'clojure.repl' (nicht so viel Zeit für Clojure atm) - gut zu wissen. Aber wie benutzt man es mit Java-Zeug, wie vom OP gefordert? '(clojure.repl/dir String)' funktioniert nicht für mich. – danlei

+0

Wahr, es ist nur für Clojure-Namespaces. – Jonas

+0

Ich frage mich, warum sie nicht so etwas wie 'show' in clojure.repl dann enthalten. Wie auch immer, +1 für deine Erwähnung. – danlei