On Wed, Oct 20, 2010 at 3:21 PM, Rich Hickey <richhic...@gmail.com> wrote: > > > On Oct 20, 1:34 pm, cej38 <junkerme...@gmail.com> wrote: >> This question leads into something that I read in Joy of Clojure (page >> 161 in the latest MEAP edition): >> "If you manage to hold onto the head of a sequence somewhere within a >> function, then that sequence will be prevented from being garbage >> collected. The simplest way to retain the head of sequence is to bind >> it to a local. This condition can occur with any type of value bind be >> it to a reference type or through the usage of let or binding." >> >> I am not sure what this means, but I think it would mean that using >> let as you do, could cause garbage collection problems. Thus, it >> might be better to follow the advice of Stuart and Luc. >> >> Chad >> >> PS. Clarification of the statement from the Joy of Clojure would be >> helpful. >> > > That advice seems stale, given: > > http://groups.google.com/group/clojure/msg/9b4e268b85c20cd6 > > let-bound locals get cleared on last use.
The quoted section should perhaps be clarified with better wording, but the example immediately following that quote still accurately demonstrates the point we were trying to make: (let [r (range 1e9)] [(first r) (last r)]) ;=> [0 999999999] (let [r (range 1e9)] [(last r) (first r)]) ; java.lang.OutOfMemoryError: GC overhead limit exceeded "Clojure's compiler can deduce that in the first example the retention of `r` is no longer needed when the computation of `(last r)` occurs and therefore aggressively clear it. However, in the second example the head is needed later in the overall computation and can no longer be safely cleared." This is dramatically better than the "invisible" head-holding that sometimes happened in earlier versions of Clojure (and was noted in earlier versions of JoC), but is still good to be aware of. --Chouser http://joyofclojure.com/ -- 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