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 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

Reply via email to