I think the current behavior follows the principle of least surprise:

(1) bar is a function, in whatever namespace the protocol Foo is defined in

(2) you redefine bar (perhaps by reloading the file Foo is in)

(3) you call bar and get the new behavior

Remember that bar lives in Foo's namespace, not in fooed's. Also: what should 
your expectation be if the second definition of Foo had changed the arity of 
bar?

Stu

> So if I do this in a clean REPL
> 
> Clojure 1.2.0
> user=> (defprotocol Foo (bar [this x]))
> Foo
> user=> (defrecord fooed [] Foo (bar [this x] (* 2 x)))
> user.fooed
> user=> (defprotocol Foo (bar [this x]))
> Foo
> user=> (extend-type Object Foo (bar [this x] (/ 2 x)))
> nil
> user=> (def fooey (fooed.))
> #'user/fooey
> user=> (bar fooey 10)
> 1/5
> user=> (defrecord fooed [] Foo (bar [this x] (* 2 x)))
> user.fooed
> user=> (def fooey (fooed.))
> #'user/fooey
> user=> (bar fooey 10)
> 20
> 
> I would have expected 20 the first call to bar to be 20.
> 
> This is a natural sequence of lines to execute if you---for
> instance--- have Foo defined in file A and fooed in file B, and you
> then add a default implementation using extend-type in file A and then
> recompile file A.
> 
> This scenario is easily fixed by recompiling file B (as the last few
> lines demonstrate).
> 
> I don't see any easy way to actually fix this behavior (though my
> understanding of how protocols are implemented is largely based on
> seeing how they behave and my limited knowledge of the JVM, rather
> than actually looking at the code), but it does seem like it would be
> less surprising if it could be accomplished.
> 
> Thoughts? Should I post this as a ticket in assembla?
> 
> -- 
> 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

-- 
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