Eh. Not just any collisions, but only ones where the succession of tails are equal-as-seqs but not identical as objects (.equals, but not ==) for "sufficiently long". So seqs that differ after only a trillion items would blow up. So would equal ones sharing no tail structure. Putting (iterate inc 0) and (range) into a hashset together would fail, and (concat (range 1000000000) [3]) and (concat (range 1000000000) [4]) dropped in together would either fail or make things really, really sloooooow, depending on whether anything held onto the head of either seq.
On Fri, Mar 22, 2013 at 2:37 AM, Cedric Greevey <cgree...@gmail.com> wrote: > Hrm. Sounds like getting the hash of an infinite sequence will hang or > cause OOME. > > On the one hand, *most* uses of the hash are followed by .equals if the > hashes match, and .equals on an infinite seq can't work, since if it gives > up and says "equal" after some large number N of elements, the seqs might > still differ at position N + 1, and there's no *general* way to determine > in an analytic manner whether two seqs will produce identical output, or > even whether they're infinite (even given the generating code, those're > equivalent to the halting problem). > > On the other hand, the above use of the hash does *not* require equals to > work. Hash could be changed to use only the first N elements of the seq, at > most, for some N, and would then work for such uses as in the generic > .toString. > > On the gripping hand, a) doing this would make infinite seqs *mostly* work > in associative data structures, but with intermittent failures (when there > were collisions), instead of failing promptly every time, and b) .toString > for LazySeq might more productively just produce "(the seq)", if it's going > to fail on infinite seqs anyway. > > > > On Fri, Mar 22, 2013 at 2:29 AM, Nelson Morris > <nmor...@nelsonmorris.net>wrote: > >> If I'm reading everything correctly: >> >> 1. Object 's .toString uses .hashCode() >> 2. LazySeq 's .hashCode() uses seq() which realizes a seq. >> 3. LazySeq 's .hashCode() calls .hashCode() on the realized seq >> 3. (map ..) creates a LazySeq with a fn to create (cons val (lazy-seq >> (map f rest))) >> 4. (cons ... ...) creates a Cons >> 5. Cons uses Aseq's .hashcode() which traverses each object in the seq >> and merges the hashcodes together. >> >> A similar thing happens with a (range) as it builds a ChunkedCons >> which also uses Aseq's hashcode. >> >> On Fri, Mar 22, 2013 at 12:53 AM, Marko Topolnik >> <marko.topol...@gmail.com> wrote: >> > I am deeply puzzled abouth the behavior of .toString invocation on a >> lazy >> > sequence. >> > >> > ==> (.getClass (map println (range 100))) >> > clojure.lang.LazySeq >> > ==> (.toString (map println (range 100))) >> > ;; integers 0..100 printed >> > "clojure.lang.LazySeq@590b4b81" >> > >> > It should be obvious from the output, but for the record: LazySeq >> doesn't >> > override toString, so just the basic Java method is called. How can this >> > possibly cause the sequence to be realized? >> > >> > Beyond my curiosity, however, what possible purpose could such behavior >> > serve? >> > >> > -marko >> > >> > >> > >> > On Thursday, March 21, 2013 7:54:39 PM UTC+1, Razvan Rotaru wrote: >> >> >> >> Hi, >> >> >> >> I'm curious, why doesn't toString of clojure.lang.LazySeq return the >> >> entire sequence as a String, and returns the Java pointer instead? I >> find it >> >> annoying when I do this: >> >> >> >> >> >> user> (str (map + [1 2 3])) >> >> "clojure.lang.LazySeq@7861" >> >> >> >> >> >> What's the reason behind this decision? Shouldn't toString trigger the >> >> evaluation of the sequence? Doesn't it do that for other values, like >> >> numbers and vectors? >> >> >> >> Is there an alternative to the code above (preferably simple and >> elegant), >> >> which will return the etire sequence? >> >> >> >> >> >> Thanks, >> >> Răzvan >> > >> > -- >> > -- >> > 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. >> > >> > >> >> -- >> -- >> 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. >> >> >> > -- -- 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.