Ok. I understand.
So, if you want to do some programming that generates insances, it should be
done with symbols, at the macro-level?



On Mon, Jul 12, 2010 at 10:01 AM, Meikel Brandmeyer <m...@kotka.de> wrote:

> 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<clojure%2bunsubscr...@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