On Monday, April 15, 2013 1:50:37 AM UTC+2, tyaakow wrote: > Thank you for your response, Marko. > I want to clarify one more thing: > > (let [[t d] (split-with #(< % 12) (range 1e8))] > [(count d) (count t)]) > > > does this mean that while (count d) is realizing (range 1e8) seq, it > becomes (also) realized within t, therefore > it doubles (range 1e8) in memory causing OOME while (count d) is still not > finished? >
There is no doubling: *t* and *d* share the same underlying lazy sequence and will refer to the same objects. The trouble is only that you force the evaluation of *(count d)* while *(count t)* still waits to be evaluated, so *t* must definitely stay bound to the head of the shared sequence. > Also, you say "As *count* realizes one element after another, it doesn't > on its own retain a reference to the past elements." > > Does this mean that, eg. in repl, when I do some (count xyz) and it > realizes xyz, It will later need to be reevaluated (realized again) if I > require xyz within repl (I presume that if I require xyz later within file, > it wont be GC due to it and clojure will know it shouldnt be GC) Be careful to observe that I say "doesn't *on its own* retain a reference to the past elements". If you have *xyz* bound to the head of your sequence, it will force the entire sequence to stay in memory for as long as *xyz* is within scope (if it's a local) or indefinitely (if it's a global def'd var). Generally, a lazy sequence never gets un-realized once it got realized---the only option is for it to disappear entirely (turn into garbage). -marko -- -- 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.