2010-08-02 5 views
5

He creado un protocolo en Clojure 1.2 que maneja mis propias clases de Java y tiene un manejo predeterminado para un java.lang.Object genérico. El código es algo como:Prolongar protocolos para clases, mapas y secuencias personalizados de Java en Clojure

(extend-protocol PMyProtocol 
    my.java.ClassName 
    (protocol-function [c] 
     "My Java class result") 

    java.lang.Object 
    (protocol-function [c] 
     "Default object result")) 

Cómo debería extender esto para tener un manejo especial para las estructuras de datos estándar Clojure (en particular los mapas, vectores y secuencias)?

Respuesta

4

Todas las estructuras de datos persistentes de Clojure implementan interfaces que extienden clojure.lang.PersistentCollection. Las colecciones transitorias de Clojure implementan clojure.lang.TransientCollection. Puedes extender tu protocolo a estos como si lo extendieras a una clase (aunque lidiar solo con las colecciones persistentes podría tener más sentido).

+2

Para nombrarlos explícitamente en caso de que sea necesario un manejo diferente: 'c.l.IPersistentMap',' c.l.IPersistentVector', 'c.l.IPersistentSet' (hay algún sistema allí ...) y para las secuencias' c.l.ISeq'. – kotarak

+0

¡Gracias Michal y kotarak! Terminé usando clojure.lang.IPersistentMap y clojure.lang.ISeq, que funcionan bien. – mikera

Cuestiones relacionadas