Hi, On Jul 12, 10:44 am, Nicolas Oury <nicolas.o...@gmail.com> wrote:
> After playing a bit with protocols I found this (which seems odd to me): > > (All of this on clojure-1.2.0-master-SNAPSHOT, downloaded with lein - i > don't know how recent it is) > > user> (defprotocol Foo (foo [x] )) ; We define a protocol Foo > user> (def bar {:foo Foo}) ; We hide it in a record > #'user/bar > user> (= (:foo bar) Foo) ; It's still equal to itselffrom > true > user> (extend Object (:foo bar) {:foo (fn [x] :bar)}) ; We extend it > nil > user> (foo 5) ; It works > :bar > user> (= (:foo bar) Foo) ; it's not equal to itself anymore > false > > By the way, if you look at the extenders of each: > user> (extenders (:foo bar)) > nil > user> (extenders Foo) > (java.lang.Object) > > Foo is extended but not its copy. > > Is it what it is supposed to do? I think this is the expected way. Since clojure emphasises immutability you don't modify a Protocol by extending it to some type, instead you get back a new version of it extending to the type. Multimethods work similarly, IIRC. Your previously stored version of the protocol is the old one, which is not extended. Hence the nil on the extenders call. (foo 5) however sees the new protocol and hence does the right thing. This is backed solely by a gut feeling of mine, but I would not be surprised if it were close to the truth. Sincerely Meikel -- 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