Guys, thank you all for input. I found that both keywords were (as you expected) loaded by same classloader (same parent was used in both). After fixing that the assert indeed fails.
Cheers! On Thursday, 13 February 2014 00:41:12 UTC+1, Alex Miller wrote: > > Reading a little more closely, that's an identity comparison in Java, not > an equals comparison in Clojure (who uses Java anyways? :). So I would > retract my last statement. The question is really whether the two > classloaders are deferring the load of the common class to a parent > classloader that loads the same Keyword class. You can ask the Keyword > classes you have for their classloader and then look through the parents to > investigate that question. > > > > On Wednesday, February 12, 2014 5:32:07 PM UTC-6, Alex Miller wrote: >> >> I think it's a little more subtle than that. Symbols are composed of a >> String name and a String namespace. When symbols are created they intern >> each of those Strings. Interned Strings are comparable by identity across >> the JVM. Symbol equals() compares name and namespace. Keyword extends from >> Symbol and calls into the Symbol interning and inherits the equals() >> implementation. >> >> As Jozef mentions, the Keyword intern table is held in a static map in >> Keyword and that would not be shared if you had multiple Clojure >> classloaders. However, I think the Keyword intern table is largely to avoid >> creating multiple instances of the same Keyword (as well as safely cleaning >> them up if no one is using them anymore). This is all irrelevant for the >> equality comparison in the original post. >> >> >> On Wednesday, February 12, 2014 10:45:38 AM UTC-6, Jozef Wagner wrote: >>> >>> Interning table uses keyword's symbol as a key, and the symbols are >>> compared by value. See >>> https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Keyword.java#L37 >>> >>> >>> On Wed, Feb 12, 2014 at 5:23 PM, Arkadiusz Komarzewski < >>> akomar...@gmail.com> wrote: >>> >>>> Hi, >>>> >>>> I wonder how is equality of keywords implemented in Clojure? >>>> >>>> I have this piece of Java code executed in one classloader: >>>> Keyword a = (Keyword) RT.var("clojure.core", >>>> "keyword").invoke("keyword"); >>>> >>>> Then, when I pass it to another part of my application (which uses >>>> another classloader) and do this: >>>> Keyword b = (Keyword) RT.var("clojure.core", >>>> "keyword").invoke("keyword"); >>>> assert a == b; >>>> >>>> Assertion passes. >>>> Why does it work? If I'm correct, keywords are interned, but since they >>>> were created in separate classloaders shouldn't that assert fail? >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To post to this group, send email to clo...@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+u...@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 unsubscribe from this group and stop receiving emails from it, send >>>> an email to clojure+u...@googlegroups.com. >>>> For more options, visit https://groups.google.com/groups/opt_out. >>>> >>> >>> -- 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 unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.