2010-08-02 13 views
5

Ho creato un protocollo in Clojure 1.2 che gestisce le mie proprie classi Java e ha una gestione predefinita per un java.lang.Object generico. Il codice simile a:Protocolli estesi per classi personalizzate, mappe e sequenze Java in Clojure

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

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

Come dovrei estendere questo per avere un trattamento speciale per le strutture dati Clojure standard (in particolare mappe, vettori e sequenze)?

risposta

4

Tutte le strutture di dati persistenti di Clojure implementano interfacce che estendono clojure.lang.PersistentCollection. Le raccolte temporanee di Clojure implementano clojure.lang.TransientCollection. Puoi estendere il tuo protocollo a questi come se lo stessi estendendo ad una classe (anche se occuparsi solo delle collezioni persistenti potrebbe avere più senso).

+2

Per denominarli esplicitamente nel caso sia necessaria una diversa gestione: 'c.l.IPersistentMap',' c.l.IPersistentVector', 'c.l.IPersistentSet' (c'è un qualche sistema in là ...) e per le sequenze' c.l.ISeq'. – kotarak

+0

Grazie Michal e kotarak! Ho finito per usare clojure.lang.IPersistentMap e clojure.lang.ISeq che funzionano bene. – mikera

Problemi correlati