On 13 Nov., 17:07, Rich Hickey <richhic...@gmail.com> wrote: > This kind of do-nothing microbenchmarking demonstrates nothing. > Protocol dispatching is significantly faster than multimethod > dispatching, and I haven't even looked into call-site optimization. > Protocol dispatch is not as fast as interface dispatch, and may or may > not become so with call-site caching. But, protocols :on interfaces > are precisely as fast when called with instances of the :on interface > as calls to the :on interface.
Forget what I said about Performance, I didn't realize that the functions could be mapped to interface-methods. When mapped to an interface they get JITed to awesome speeds :-) > I wouldn't want to key anything off of fn identity. It would make > mixins quite difficult. This was just a minor thought of mine, if it impedes with this awesome literal mixin concept then I gladly take those mixins. (def composed-mixin (merge mixin-a mixin-b mixin-c)) seems absolutely logical and natural > > ....... > > Admittedly, it is a difference from multimethods. With protocols, both > protocols and their functions/methods are immutable. Redefining or > extending a protocol modifies only the protocol and fn vars. I prefer > that, and don't consider the above behavior a problem. What do others > think? > > Rich that was a bad Example probably... hypothetical example for impementing the type function as a Protocolfn: (defprotocol Typed (my-type [obj] "Doc..")) Typed (extend Object Typed {:my-type (fn [obj] (.getClass obj))}) nil (defmulti foo my-type) #'user/foo (extend clojure.lang.IObj Typed {:my-type (fn [obj] (if (:type ^obj) (:type ^obj) (.getClass obj)))}) now our foo multifn woudn't work as expected (by me at least). I just didn't expect that (extend <sth> <Type> <fn-map>) would redefine some Vars. extend has to mutate something, but I think that redefining some Vars is wierder (and thus should be explicit via a visible (def ...)) than mutating the "generic function" (I may be biased by CLOS of course) Alex -- 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