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

Reply via email to