On Wed, Jun 24, 2009 at 2:20 AM, Christophe Grand<christo...@cgrand.net> wrote:
> On Tue, Jun 23, 2009 at 11:59 PM, Daniel Lyons <fus...@storytotell.org>
> wrote:
>>
>> But if I try it with your original number (10x bigger than mine) I run out
>> of Java heap space. Which didn't happen before either, because the lists
>> weren't materialized.
>> So range is cheating here? How's that?
>
> Range, like most specialized seqs, aren't implemented as a (lazy) linked
> list. They are simply a reference to the parent collection and an index.
> There's no reference to the next element, a new next is built each time you
> call 'next.
>
> user=> (let [s (seq (range 10))] (identical? (next s) (next s)))
> false
> user=> (let [s (seq [1 2 3])] (identical? (next s) (next s)))
> false
> user=> (let [s (seq {1 2 3 4})] (identical? (next s) (next s)))
> false
> user=> (let [s (seq "abc")] (identical? (next s) (next s)))
> false
> user=> (let [s (seq '(1 2 3 4))] (identical? (next s) (next s)))
> true
> user=> (let [s (seq (map identity (range 10)))] (identical? (next s) (next
> s)))
> true
> user=> (let [s (seq (take 10 (iterate inc 0)))] (identical? (next s) (next
> s)))
> true
>
> Hence keeping a reference to the head doesn't retain the next seqs in
> memory.
> (apply + ...) must hold a reference to the head (don't know where) and thus
> crashes when the seq isn't a specialized seq.
>

apply retains the head because it calls through Java (IFn.applyTo)
where it is not possible to clear locals before tail calling, so the
head is on the stack.

I'm afraid everyone's gotten spoiled :), but apply does have the
general limitation that any args consumed must fit in memory.

Rich

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to