On Fri, Feb 10, 2012 at 1:07 PM, Aaron Cohen <aa...@assonance.org> wrote: > On Fri, Feb 10, 2012 at 3:13 AM, drewn <naylor...@gmail.com> wrote: >> I've just started learning protocols, deftype, etc. The first thing I >> did was try to extend a Clojure type (maps) to operate as a >> specialized Java Swing interface (AttributeSet), forgetting that >> interfaces are not protocols; i.e. >> >> (extend-type clojure.lang.PersistentArrayMap >> javax.swing.text.AttributeSet >> (getAttribute [this k] >> (get this k))) > > I think in this case you should be able to use proxy, maybe. > > user=> (defn attribute-list [map] (proxy [javax.swing.text.AttributeSet] [] > (getAttribute [k] (get map k)))) > > user=> (.getAttribute (attribute-list {:a 1 :b 2}) :a) > 1
There's also defrecord: (defrecord foo [my basis keys] the.JavaInterface (javaIfaceMethod [this foo] ...)) which will work in the specific case that you want "a Clojure map that implements a particular Java interface". Records behave partially as Clojure maps. For more general mixins, proxy, reify, and deftype are your friends, and even gen-class may be needed in some instances. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en