I must agree with Lee that, IMHO, default laziness can cause unexpected problems. I would argue that it violates the Principle of Least Surprise.
A better way would be to make laziness optional and explicit, perhaps by adding a "z" suffix to the lazy version of each function (e.g. map -> mapz, for -> forz, etc). Then lazy behavior would be available whenever it was desired, but the code would explicitly indicate when laziness was being employed. Alan On Thu, Aug 13, 2015 at 11:01 AM, Lee Spector <lspec...@hampshire.edu> wrote: > > > Thanks Sebastian for the thoughtful and helpful document! I like it and > have shared it with my group. > > > On Aug 13, 2015, at 1:51 PM, Sebastian Bensusan <sbe...@gmail.com> > wrote: > > > > > > I never thought of laziness! It's a good point. Retroactively I might > add it to the Functional Style section :) > > You did a nice job of presenting both pros and cons for the other features > of Clojure, and I expect there would be something similar for your entry on > laziness.... but FWIW from my perspective the cons here are more > significant than for any other feature (and I know that opinions will vary > on this!). > > I know that no language is perfect for everyone or every purpose, but at > least from my perspective pervasive laziness is "one of Clojure's very few > true mistakes" (sort of like my father-in-law says that "eggplant is one of > god's very few true mistakes"). > > Laziness is often glorious and elegant, and the way that it's everywhere > by default in Clojure is quite cool. But in a not-purely-functional > environment it can cause weird problems at unexpected times and in > unexpected places. There are several ways to get into trouble -- there was > a nice blog post on some of them years ago, maybe by Chas Emerick? -- but I > think most of my own come from the not-purely-functional nature of > synchronization, awaiting the completion of tasks dispatched to agents. > Symptoms that I get include the saturation of only one core when I expect > to be saturating all of them, and sometimes out-of-memory errors. I think > the former are due to delayed lazy computations taking place at unexpected > times, and that the latter come from GC not collecting things that it would > know it could collect if the deferred computations were completed in a > non-lazy way. > > It has been hard to replicate or track down the sources of these problems, > but they do always go away when I un-lazify everything -- coercing > sequences to vectors, calling doall, changing every call to map to mapv, > etc. > > Because these problems are so hard to diagnose and think about, I've taken > to pre-emptively avoiding laziness whenever possible, unless I really want > it (which is relatively rare, for me). This can be a bit awkward, and it's > one of the very few things that I feel like I have to apologize for when I > introduce Clojure to students. > > -Lee > > > -- > 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/d/optout. > -- 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/d/optout.