¿Cuál es la mejor manera de hacer introspección en Clojure? ¿Hay algo así como la función dir
de Python? Estoy particularmente interesado en encontrar los métodos que están disponibles en las clases de Java con los que estoy interoperando, pero también estoy interesado en descubrir cualquier cosa que esté disponible en Clojure relacionada con la introspección.Introspección en Clojure
Respuesta
Si quieres descubrir métodos, sólo tiene que utilizar llanura de Java reflexión:
user=> (.getDeclaredMethods (.getClass {:a 1}))
#<Method[] [Ljava.lang.reflect.Method;@72b398da>
user=> (pprint *1)
[#<Method private int clojure.lang.PersistentArrayMap.indexOf(java.lang.Object)>,
#<Method public int clojure.lang.PersistentArrayMap.count()>,
#<Method public java.util.Iterator clojure.lang.PersistentArrayMap.iterator()>,
#<Method public boolean clojure.lang.PersistentArrayMap.containsKey(java.lang.Object)>,
#<Method public int clojure.lang.PersistentArrayMap.capacity()>,
#<Method public clojure.lang.IPersistentMap clojure.lang.PersistentArrayMap.empty()>,
...
También puede escribir un poco más agradable con una macro rosca:
(-> {:a 1} .getClass .getDeclaredMethods pprint)
o
(-> clojure.lang.PersistentArrayMap .getDeclaredMethods pprint)
(¡Acabo de enterarme de #clojure IRC que el nombre de la clase en sí ya es el objeto Class!)
'(.getDeclaredMethods (clase {: a 1}))' funciona, también. – Mars
Si está utilizando 1.3, hay clojure.reflect que le permite inspeccionar, manipular, etc. información sobre las clases de Java. También me gusta el clojure.contrib.repl-utils/show del contrib anterior si esa es una opción para ti.
Consulte clojure.contrib.repl-utils
, y show
en particular.
http://richhickey.github.com/clojure-contrib/repl-utils-api.html#clojure.contrib.repl-utils/show
Estos son utilidades para la introspección de los objetos y clases en el REPL, pero el código es un buen ejemplo de cómo explorar clases de programación.
Michiel Borkent y Dave Ray tienen las opciones de interoperabilidad cubiertas.
Para descubrir las funciones de Clojure, hay un par de opciones en el espacio de nombres clojure.repl
(que probablemente ya se mencionen en su REPL por defecto).
dir
:
=> (require 'clojure.set)
nil
=> (dir clojure.set)
difference
index
intersection
join
map-invert
project
rename
rename-keys
select
subset?
superset?
union
apropos
:
=> (apropos #"^re-")
(re-pattern re-matches re-matcher re-groups re-find re-seq)
find-doc
:
=> (find-doC#"^re-")
-------------------------
clojure.core/re-find
([m] [re s])
Returns the next regex match, if any, of string to pattern, using
java.util.regex.Matcher.find(). Uses re-groups to return the
groups.
-------------------------
clojure.core/re-groups
([m])
Returns the groups from the most recent match/find. If there are no
nested groups, returns a string of the entire match. If there are
nested groups, returns a vector of the groups, the first element
being the entire match.
-------------------------
....
Para encontrar interfaces implementadas por una clase, intentan supers
(supers clojure.lang.PersistentHashMap)
clojure.contrib.repl-utils
se ha trasladado a clojure.reflect
.
Ahora puede llamar como la siguiente:
(->> (clojure.reflect/reflect java.lang.String)
:members
clojure.pprint/pprint)
- 1. Cómo hacer introspección en R
- 2. Objetivo C Introspección/Reflexión
- 3. Java Pila introspección
- 4. Python: introspección práctica
- 5. Java introspección: objeto al mapa
- 6. Introspección de clase en Common Lisp
- 7. ¿Definición de estructura de introspección en C++?
- 8. D: nombre de parámetro de función introspección
- 9. Python assert: ¿mejor introspección de fallas?
- 10. Introspección de lenguajes de programación funcional
- 11. introspección SQLAlchemy de las clases declarativas
- 12. Introspección SQLAlchemy de clases/objetos ORM
- 13. regla de introspección Django-Sur no funciona
- 14. ¿Cómo hacer la introspección del objeto JavaScript?
- 15. Introspección del módulo win32com/módulo de pythoncom
- 16. ¿Qué es la "finalización de código basada en la introspección"?
- 17. JavaBeans e introspección: ¿mal estado en propiedades booleanas e indexadas?
- 18. ¿Introspección para obtener nombres de decoradores en un método?
- 19. Clase/forName en Clojure no respetando ContextClassLoader?
- 20. línea de comandos análisis arg a través de la introspección
- 21. búsqueda XML en Clojure
- 22. Bonita impresión en Clojure
- 23. Reemplazando 'requerir' en Clojure?
- 24. Cola inmutable en Clojure
- 25. Enorme XML en Clojure
- 26. Tipos anidados en clojure?
- 27. recursivo (doall) en clojure
- 28. contador sincronizado en clojure
- 29. Clojure en Android
- 30. Usando cotización en Clojure
Tal clojure.reflect es vale la pena analizar también. http://clojure.github.io/clojure/clojure.reflect-api.html – claj