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.


Reply via email to