On Fri, Mar 27, 2009 at 4:58 PM, mikel <mev...@mac.com> wrote: > > > > On Mar 27, 5:56 am, Konrad Hinsen <konrad.hin...@laposte.net> wrote: >> On Mar 27, 2009, at 9:25, Mark Engelberg wrote: > >> > Considering how complex the situation can get with single dispatch, I >> > imagine it gets even more complex in multiple dispatch situations. In >> > the multimethods example at clojure.org/multimethods, an example is >> > given of disambiguating between [::shape ::rect] and [::rect ::shape]. >> > But again, if you're writing the bar method from outside of the >> > library which defines ::shape and ::rect, you might not even know >> > which is more specific. It might be easier to choose a strategy, such >> > as more specific on the leftmost taking precedence, than to know the >> > details of how the various types in the library interact. >> >> I am not so sure about this. I wonder if there is a real-life use >> case where a client library would need to solve dispatching issues on >> types in another library about which it doesn't know anything. > > No, because such a library won't get used. If I offered a customer a > library with the caveat that his people might run into unexpected > dispatch conflicts that could be solved simply by reading the library > sources, he'd say, "thanks, I'll pass." > >> If >> there isn't, the problem is not relevant, and if there is, I'd like >> to see a demonstration that something like left-to-right precedence >> is indeed a reasonable default. > > I can tell you about large software projects in which left-to-right > precedence worked well. "Demonstrate"? That's a lot of code to > recapitulate! > > There is nothing magical about left-to-right precedence, except that > *you know in advance what it is*. You can reason about it, because you > know what it is. You can predict what kinds of uses will be a problem, > and therefore can avoid those problems. For purposes of writing > reusable and extensible subsystems, *any* defined order is better than > no defined order. > >> On the other hand, I would definitely like to be able to implement >> left-to-right precedence myself on top of Clojure's multimethods, and >> it seems that at the moment this is not possible. > > There it is: it's fine if Clojure doesn't define a default and > universal traversal order for MultiFn dispatch, as long as I can > define such an order when I need it. prefer-method isn't quite enough, > because it only works on dispatch values that are already defined. In > order to make a safely-extensible library, I need to be able to > prescribe a traversal order over dispatch values that haven't yet been > created. > > I have a separate issue with prefer-method, in that it defines > traversal order implicitly, in a way that is hard to digest. That is, > you can't look in one place to find out what the traversal is; you > instead have to search out all the prefer-method calls and piece the > order together from examining each of them. That's tangential to the > present discussion, though. >
There is prefers: (prefers print-method) -> {clojure.lang.ISeq #{clojure.lang.IPersistentCollection java.util.Collection}, clojure.lang.IPersistentList #{clojure.lang.ISeq}} > If none of these considerations moves Rich much, that's okay. He gave > us the tools we need to write our own solutions. Hang tight - I hear your concerns and am thinking about them. Rich --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---