On Tue, Dec 21, 2010 at 9:09 AM, Miles Trebilco <miles.van...@gmail.com> wrote:
> Why does this cause an out of memory error:
>
> (def out_of_mem
>  (reduce + 0 (range 50000000)))
>
> while this does not:
>
> (def not_out_of_mem
>  (let [result 0]
>  (reduce + result (range 50000000))))
>
> and neither does this in the REPL:
>  (reduce + 0 (range 50000000)))

The first instance must be holding onto the head of (range 50000000)
for some reason.

If I had to hazard a guess I'd say it's something in the
implementation of the def special form that causes it. Further, I'd
hypothesize that the let form somehow shields the range from having
its head held onto. One piece of evidence is this:


user=> (def x (let [y 100] (reduce + 0 (range 50000000))))
#'user/x
user=> x
1249999975000000

Even if the let binding is completely irrelevant to the range and the
reduce, it doesn't OOME.

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