¿Hay alguna manera documentada de encontrar qué protocolos implementa un objeto Clojure? A la inversa (mostrar para qué clases se extiende un protocolo determinado) es fácil: (protocolo de extensores).¿Cómo encuentro los protocolos implementados en el objeto Clojure?
Respuesta
que terminó con la siguiente implementación:
(defn protocol? [maybe-p]
(boolean (:on-interface maybe-p)))
(defn all-protocols []
(filter #(protocol? @(val %)) (ns-publics *ns*)))
(defn implemented-protocols [sym]
(filter #(satisfies? @(val %) sym) (all-protocols)))
En primer lugar, busca todos los símbolos en el espacio de nombres actual (por supuesto puede extender esto a todos los espacios de nombres) si son definiciones de protocolos o neta (todos -protocolos). Luego busca un símbolo dado si satisface uno de estos protocolos.
¿El protocolo? función utiliza la tecla: en la interfaz que no está documentada afaik, por lo que esta función no es portátil.
No puedo probar esto en este momento, pero es posible que desee probar el método de la clase Java: getGenericInterfaces
. Esto debería darle una lista de interfaces. Probablemente haya otras maneras de obtener esta información usando métodos similares pero no he buscado.
Si también observa el código fuente, verá cómo se configuran los protocolos (puede acceder a la fuente haciendo clic en los enlaces en la api de clojure). En Clojure 1.3 existe una función de 'privado' que tiene este aspecto:
(defn- protocol?
[maybe-p]
(boolean (:on-interface maybe-p)))
Esta función es utilizada por la función de Clojure extend
para comprobar que realmente ha proporcionado un protocolo. Si realiza su propia función de esa manera, puede filtrar los resultados de getGenericInterfaces
. Como se trata de un detalle interno, puede estar sujeto a cambios.
getGenericInterfaces me da (clojure.lang.IObj clojure.lang.ILookup clojure.lang.IKeywordLookup clojure.lang.IPersistentMap java.util.Map java.io.Serializable) pero no el protocolo implementado. Creo que tendré que profundizar en el código fuente para ver cómo se hace. –
Acabo de volver a mi máquina, y no estoy llegando más allá de usted. Probablemente sea más sencillo usar 'getInterfaces' como una alternativa razonable a' getGenericInterfaces'. Me pregunto qué pasará si AOT compila la cosa. – hutch
Parte del punto de los protocolos es que una clase no necesita implementar una interfaz para extender un protocolo: puede definir su propio protocolo y luego decir que alguna clase preexistente lo extiende con '(extender ExistingClass MyProtocol ...)'. Por lo tanto, es natural tener una manera de preguntar "qué clases amplían este protocolo", pero no una manera de formular la pregunta inversa. –
- 1. Cómo extender los protocolos numéricos en Clojure
- 2. Protocolos Clojure burladores
- 3. ¿Influencia de los protocolos de Clojure?
- 4. despacho dependientes Medio Ambiente de protocolos/métodos múltiples en clojure
- 5. ¿Cómo encuentro dinámicamente metadatos para una función de Clojure?
- 6. ¿Cómo veo los métodos asociados con un objeto en Clojure?
- 7. ¿Por qué los protocolos Objective-c adoptan otros protocolos?
- 8. Cómo escribir el protocolo monoide en Clojure?
- 9. ¿Cómo encuentro las llamadas a los métodos?
- 10. Diferencia entre los protocolos de Clojure y las categorías de Groovy
- 11. ¿Cómo encuentro el directorio actual?
- 12. protocolos binarios v. Protocolos de texto
- 13. ¿Cómo encuentro el directorio 'temp' en Linux?
- 14. ¿Por qué los inicializadores designados no están implementados en g ++
- 15. ¿Cómo manejar los protocolos de Objective-C que contienen propiedades?
- 16. ¿Cómo encuentro todos los puntos en una ruta en Android?
- 17. DSL interesantes, implementados en Scala?
- 18. Rieles: ¿Cómo encuentro() todos los registros únicos en ciertos campos?
- 19. Prolongar protocolos para clases, mapas y secuencias personalizados de Java en Clojure
- 20. ¿Se considera que los protocolos sin estado son mejores para usar en protocolos con estado?
- 21. Diferencia entre los protocolos FIX y FAST?
- 22. ¿Deben los protocolos cumplir con el protocolo NSObject?
- 23. Cómo simular un objeto de Java en Clojure
- 24. posibles protocolos web en javascript
- 25. Cambiar el nombre de los métodos implementados para el patrón Observer en Java
- 26. ¿El carácter 96 HEX tiene algún significado especial en los protocolos/formatos de Internet?
- 27. Cómo extender protocolos/delegados en Objective-C
- 28. ¿Qué lenguajes de programación tienen los intérpretes implementados más fácilmente?
- 29. ¿Cómo se hace un objeto invocable en Clojure?
- 30. ¿Dónde encuentro los registros de System.out.println()?
'protocolo?' Falla en un mapa ordenado, al menos en Clojure 1.8. Ver [esta pregunta] (http://stackoverflow.com/q/37410580/1393162). –