2011-01-09 12 views
15

¿Alguien sabe si hay un equivalente Clojure para pitones "dir". Básicamente, necesito saber las funciones que puedo invocar sobre algo o más específicamente para objetos Java. Quiero conocer los métodos y las propiedades disponibles (no estoy seguro si en Java se llaman métodos y propiedades, esto es lenguaje de C#).Python "dir" equivalente en Clojure

Respuesta

15

clojure.contrib.repl-utils/show para su uso en el 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[]) 
... 

Como alternativa, tal vez algo como:

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

.getFields, y .getConstructors en consecuencia.

8

El clojure.repl espacio de nombres (que está disponible desde Clojure 1.2) contiene la macro dir y la función 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, echaba de menos la introducción de 'clojure.repl' (no mucho tiempo para Clojure atm) - bueno saber. Pero, ¿cómo lo usas con Java, como lo pide el OP? '(clojure.repl/dir String)' no funciona para mí. – danlei

+0

Es cierto, es solo para espacios de nombres Clojure. – Jonas

+0

Me pregunto por qué no incluyeron algo como 'show' en clojure.repl a continuación. De todos modos, +1 por mencionarlo. – danlei