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.