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