Redefining Foo gives you a new implementation of bar, which, like any protocol method, will fail for all inputs until a type has been extended to it.
> I ran your sequence without redefining Foo and got 20 instead of 1/5. > I don't know how that redefinition affects the evaluation of bar. > > Clojure 1.2.0 > user=> (defprotocol Foo (bar [this x])) > Foo > user=> (defrecord fooed [] Foo (bar [this x] (* 2 x))) > user.fooed > user=> (extend-type Object Foo (bar [this x] (/ 2 x))) > nil > user=> (def fooey (fooed.)) > #'user/fooey > user=> (bar fooey 10) > 20 > > On Aug 25, 8:55 am, DeverLite <derby.lit...@gmail.com> wrote: >> 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