On Thu, Nov 4, 2010 at 10:17 PM, ka <sancha...@gmail.com> wrote: > > May I ask a heretic question: Why don't you specify the contract in the > docstring of the protocol? > > (defprotocol Coolness > "Yadddayaddablablablubber. > Cool things have to be Comparable and Serializable." > (x .. "Since 'this' is cool i assume it is Serializable and > Comparable and so logically I can safely do this cool x thing!") > (y ...)) >
This would be a terrible protocol - protocols do not compose in this manner. > static public ISeq seq(Object coll){ > if(coll instanceof ASeq) > return (ASeq) coll; > else if(coll instanceof LazySeq) > return ((LazySeq) coll).seq(); > else > return seqFrom(coll); > } > > Do you see the above seq method as a design problem? - or if you don't > care about Java, consider clojure.walk. > You can't fix Java so I'm not sure that's a legitimate example. clojure.walk suffers from the "closed" property. > If I understand you correctly (probability of which is less) you don't > really see protocols as defining abstractions - but just as a > convenient tool for polymorphism. Like: > polymorphism *is* a form of abstraction. > I simply asked - is there anything fundamentally wrong with the notion > of those protocols being composable. Protocol P is a set of abstract > functions, can we have a convenient way of saying P = union(P1, P2) ? > This is desirable, but it's not clear whether this should be a feature of protocols themselves. > On a related note how is this: > > (defn dispatch-fn [this ..] > (if (and (comparable? this) (serializable? this)) > :green-signal :red-signal) > Aha! Getting warmer. This highlights a sore spot in the current multimethod implementation - the dispatch fn is "closed". Rich has expressed several times that he would like to see a predicate dispatch implementation for clojure that removes this wart. David -- 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