Could possibly clojure multimethods be enhanced to support more general use
cases (enabling to e.g. define generic functions on top of it), while still
be fast for the current behavior ?

It seems to me that being able to redefine the function that matches the
computed dispatch-value of the call to the multifn to the declared
dispatch-values, plus the possibility to customize the algorithm used for
disambuiating candidate methods could be enough ? (maybe not for the
next-method .. stuff, but a basis for finding the next-method could be based
on the disambiguaiting algorithm if it is implemented like a comparator ?)

Then defmulti could accept two additional arguments (maybe forcing that the
default value be also present in this case, for backward compatibility) :

(defn clos-like-dispatcher [computed checked]
  (every? identity (map  isa? computed checked)))

(defn clos-like-disambiguier [val-1 val-2]
  (if (every? identity (map isa? val-1 val-2))
    val-1
    val2))

(defmulti add (partial map type) :default clos-like-dispatcher
clos-like-disambiguier)

... Or something more performant by being able to override the global
disambiguing function given the list of all candidate values at once ...

Could something this be added to multi-methods, with as an optimized default
the current behavior ?

It seems that it then could be the basis for clos-like generic functions,
and a lot more cases (because it then becomes more general) than it is
currently (it seems very harcoded currently).

-- 
Laurent

2009/3/25 mikel <mev...@mac.com>

>
>
>
> On Mar 24, 10:51 pm, mikel <mev...@mac.com> wrote:
> > On Mar 24, 5:37 pm, Meikel Brandmeyer <m...@kotka.de> wrote:
>
> [...snip...]
>
> I wanted to call out a point that I made before, but that is maybe
> buried in a little too much verbiage. The point is that there is maybe
> a way for me to implement an automated and predictable answer to the
> question you raised:
>
> =======================
>
> Suppose the following situation:
>
> (define-method foo [x some.inter.Face] ...)
> (define-method foo [x some.other.Interface] ...)
>
> Now suppose you call this function foo with something like
> (proxy [some.inter.Face some.other.Interface] [] ...). Which
> magic decides which method to use?
>
> ========================
>
> The answer I propose is that dispatch chooses some.inter.Face first,
> because it appears leftmost in the sequence of interfaces you provided
> to proxy.
>
> That's not currently implemented because I'm not sure yet if the order
> of interfaces reported by a proxy object is reliably stable, and
> whether it reliably reflects their order in the original proxy
> expression.
> >
>

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