Strings are indexed. They are a special case because String is a Java final 
class that cannot be "extended" to support the core interfaces inside 
Clojure's Java implementation. If Clojure were itself protocol-based (like 
ClojureScript is), the protocol could cover this without the special case.


On Thursday, April 21, 2016 at 10:48:18 AM UTC-5, Mars0i wrote:
>
> The docstring for 'get' says nothing explicit about vectors ("Returns the 
> value mapped to key, not-found or nil if key not present.") but most of us 
> know that vectors can be viewed as associative data structures where 
> indexes are like keys:
>
> (get [\a \b \c] 1) 
> \b
>
> 'get' also works on strings:
>
> (get "abc" 1)
> \b
>
> However, strings are not treated as vectors or maps in other contexts:
>
> (assoc "abc" 1 \Z)
> ClassCastException java.lang.String cannot be cast to 
> clojure.lang.Associative
>
>
Being able to *add* something to an indexed collection is a totally 
different "behavior" than looking something up by index. Strings don't do 
that part.
 

> This combination of behaviors is confusing.  If strings are vectors, then 
> 'assoc' and other similar functions should work with them, and maybe I 
> should be able to do this to index into a string:
>
> ("abc" 1)
> ClassCastException java.lang.String cannot be cast to clojure.lang.IFn
>
> If strings are not vectors, then they seem to be a special case for 
> 'get'.  One might argue that the very terse docstring for 'get' should note 
> its use with vectors, but once you understand the sense in which vectors 
> are like maps, the of 'get' use with vectors is implicitly covered by what 
> the docstring says.  However, the use of 'get' with strings is not 
> implicitly covered by what the docstring says.  If it was, then the last 
> two examples I gave should work.
>
> (I'd be willing to file a ticket on this, but the puzzling behavior is not 
> new, and I suspect that there's something I'm not understanding.)
>

I think the current behavior and docs are correct and I'm not yet convinced 
there is a change needed. (But feel free to keep discussing and maybe I'll 
change my mind. :) 

Alex

-- 
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/d/optout.

Reply via email to