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

Reply via email to