https://gist.github.com/876029
On Fri, Mar 18, 2011 at 6:33 PM, Sunil S Nandihalli < [email protected]> wrote: > Hello everybody, > I wanted to define a bunch of types which were mutable to be used in > defining a cyclic data structure. So, I wrote the following macro .. . > > (defmacro defmutabletype [type-name members] > (let [proto-name (symbol (str "I" (name type-name))) > member-setter-names (map #(symbol (str (name %) "!")) members) > member-setter-prototypes (map (fn [setter-name] `(~setter-name > [this# newval#])) member-setter-names) > member-setter-fns (map (fn [setter-name member-name] `(~setter-name > [this# newval#] (set! ~member-name newval#))) member-setter-names members) > member-getter-prototypes (map (fn [member-name] `(~member-name > [this#])) members) > member-getter-fns (map (fn [member-name] `(~member-name [this#] > ~member-name)) members) > annotated-members (vec (map (fn [name] (with-meta name (assoc (meta > name) :volatile-mutable true))) members))] > `(do > (defprotocol ~proto-name > ~@member-getter-prototypes > ~@member-setter-prototypes) > (deftype ~type-name ~annotated-members > ~proto-name > ~@member-getter-fns > ~@member-setter-fns)))) > > (defmutabletype point [x y]) > > is equivalent to > > (do > (defprotocol Ipoint > (x [this]) > (x! [this v]) > (y [this]) > (y! [this v]) > (deftype point [^{:volatile-mutable true} x ^{:volatile-mutable true} y] > Ipoint > (x [this] x) > (x! [this v] (set! x v)) > (y [this] y) > (y! [this v] (set! y v)))) > > although not idiomatic clojure .. thought some of you may find it useful. > Sunil. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/clojure?hl=en
