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 <javascript:>> 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<javascript:>
>> 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 <javascript:>
>> 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 <javascript:>.
>> 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.

Reply via email to