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

Reply via email to