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.

Reply via email to