> There's also defrecord I considered using that, but I need to do something more with the constructor (e.g. convert the map into a Java array for internal use). Also, defrecords only takes positional arguments, which will be hard to use with tens of arguments. (An alternative is just to pass in one argument as a map itself, but that seems to defeat the purpose.)
On Feb 10, 10:32 am, Cedric Greevey <cgree...@gmail.com> wrote: > 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