On 13.11.2009, at 17:07, Rich Hickey wrote: > 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?
For most applications the difference doesn't matter. Having protocols as immutable values bound to vars that change with every extend could lead to both interesting use cases and undesirable surprises when used with threads. Threads can have thread-local implementations of protocols, intentionally or by mistake. What makes this behaviour a bit disturbing is the fact that a var in a namespace that refers to a protocol or a method is changed from code in another namespace. This is of course possible otherwise as well, but highly unusual. Consider this example: (defprotocol Foo (bar [x])) (def bar nil) Now in some other namespace, at some later time: (extend Object Foo {:bar (fn [x] x)}) This will redefine bar in the first namespace to a method of Foo. While I don't expect such a situation to be frequent, it is certainly highly unexpected. All the more so since the code in the second namespace doesn't even mention the symbol bar that it changes. Konrad. -- 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