On Thu, Dec 23, 2010 at 1:09 AM, Ken Wesson <[email protected]> wrote:
> An untested implementation:
Yeah, there's a bug or two.
> (def qlzqqlzuup (Object.))
>
> (defmacro my-defmulti [name]
> `(def name
Should be ~name.
> (let [dtable (atom (sorted-map))]
Should be dtable#, and likewise the rest of the local symbols in the
def. Probably best to hoist the bulk out to a function:
(defn dispatch-multi [dtable arg-seq]
(if (= (first arg-seq) qlzqqlzuup)
(let [[_ pri predmeth] arg-seq]
(swap! dtable assoc pri predmeth))
(loop [d (seq @dtable)]
(if d
(let [[_ [pred meth]] (first d)]
(if (apply pred arg-seq)
(apply meth arg-seq)
(recur (next d))))
(throw IllegalArgumentException
(str "no matching method in " name " for " args)))))))
(defmacro my-defmulti [name]
`(def ~name
(let [dtable# (atom (sorted-map))]
(fn [& args#]
(dispatch-multi dtable# args#)))))
Warning: still untested.
--
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