Default laziness can cause problems, but I'm not sure that they're bad problems, necessarily. I think 'opt-out' laziness (and the headaches it can cause) push people--especially people coming from non-FP backgrounds--to really zero in on writing pure, focused functions.
On the other hand, from a 'marketing' perspective, I'd talk more about transducers than laziness--they're more exotic, at least. On Thursday, August 13, 2015 at 2:27:21 PM UTC-4, Alan Thompson wrote: > > 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 <lspe...@hampshire.edu > <javascript:>> 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 >> <javascript:>> 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 clo...@googlegroups.com >> <javascript:> >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+u...@googlegroups.com <javascript:> >> 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+u...@googlegroups.com <javascript:>. >> 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.