Re: Are strings vectors? Should 'get' docstring be changed?
On Thursday, April 21, 2016 at 2:20:11 PM UTC-5, Mars0i wrote: > The behavior with strings is simply undocumented anywhere, afaik, though. > Sorry, that was wrong even before I added an example to clojure.docs. The conj.io documentation is quite explicit and detailed. -- 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.
Re: Are strings vectors? Should 'get' docstring be changed?
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.
Re: Are strings vectors? Should 'get' docstring be changed?
On Thursday, April 21, 2016 at 11:49:16 AM UTC-5, Andy Fingerhut wrote: > > Most doc strings are considered terse by many people. This appears to be > considered a feature by those who maintain Clojure, not a bug, with one > reason given by Stuart Halloway in his recent talk on using the scientific > method in debugging [1]. Paraphrased from memory it was approximately "if > you have a bug in some API you are using, you should read all of the > documentation for it. That is easier if it is short." > > If you want longer documentation and/or examples, ClojureDocs.org and > conj.io take user submissions for additional documentation, with quite > low friction. > Yeah, there are tradeoffs. I understand the value of brief docstrings. The current docstring for 'get' is correct for maps and vectors, even though the meaning for vectors won't be apparent for novices. Lots of things aren't apparent for novices. The behavior with strings is simply undocumented anywhere, afaik, though. That seems wrong. (Correction: I just added an example to clojure.docs. I still think that all of the intended behavior of a function should be at least tersely implied by its docstring.) -- 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.
Re: Are strings vectors? Should 'get' docstring be changed?
That's a good point, but it should be noted that all collections for which clojure.core/counted? returns true (they implement clojure.lang.Counted) should implement count in constant time. So the design of the Counted interface was clearly intended to provide consumers a soft guarantee of performance invariability across data structures when required. On Thursday, April 21, 2016 at 1:26:26 PM UTC-4, Michael Gardner wrote: > > On Apr 21, 2016, at 10:04, James Reeves> wrote: > > > > Clojure seems to avoid having functions that have variable performance > depending on the data structure they're applied to. > > But not always! (e.g. count) -- 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.
Re: Are strings vectors? Should 'get' docstring be changed?
That's a good point, but it should be noted that all collections for which clojure.core/counted? returns true (they implement clojure.lang.Counted) should implement count in constant time. So the design of the Counted interface was clearly intended to provide consumers a soft guarantee of performance invariability across data structures when necessary.. On Thursday, April 21, 2016 at 1:26:26 PM UTC-4, Michael Gardner wrote: > > On Apr 21, 2016, at 10:04, James Reeves> wrote: > > > > Clojure seems to avoid having functions that have variable performance > depending on the data structure they're applied to. > > But not always! (e.g. count) -- 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.
Re: Are strings vectors? Should 'get' docstring be changed?
On Apr 21, 2016, at 10:04, James Reeveswrote: > > Clojure seems to avoid having functions that have variable performance > depending on the data structure they're applied to. But not always! (e.g. count) -- 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.
Re: Are strings vectors? Should 'get' docstring be changed?
It doesn't necessarily follow that something that works with clojure.core/get needs to work with clojure.core/assoc. You can have an object that implements ILookup but not Associative, for instance. The problem with using assoc with native JVM data structures like strings and arrays is that there isn't an efficient way of implementing assoc for those structures. You have to copy the entire structure, no matter how large it might be. Clojure seems to avoid having functions that have variable performance depending on the data structure they're applied to. For example, trying to "get" on a seq also fails, presumably because seqs have no efficient way of looking up a value by index. Instead we have clojure.core/nth, which has predictable O(n) performance. - James On 21 April 2016 at 16:48, Mars0iwrote: > 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 > > 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.) > > -- > 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. > -- 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.
Re: Are strings vectors? Should 'get' docstring be changed?
This is a special case behavior of clojure.core/get, as you can see in the RT.java source file at these lines: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/RT.java#L750-L755 I have no idea if a JIRA would be accepted for any change on this or not, but if one was, I suspect it would be an addition to the doc string for clojure.core/get, mentioning that it also works on strings. Most doc strings are considered terse by many people. This appears to be considered a feature by those who maintain Clojure, not a bug, with one reason given by Stuart Halloway in his recent talk on using the scientific method in debugging [1]. Paraphrased from memory it was approximately "if you have a bug in some API you are using, you should read all of the documentation for it. That is easier if it is short." If you want longer documentation and/or examples, ClojureDocs.org and conj.io take user submissions for additional documentation, with quite low friction. Andy [1] https://www.youtube.com/watch?v=FihU5JxmnBg On Thu, Apr 21, 2016 at 8:48 AM, Mars0iwrote: > 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 > > 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.) > > -- > 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. > -- 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.
Are strings vectors? Should 'get' docstring be changed?
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 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.) -- 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.