Yes you are right, currently a lot of stuff is seq only.
I think that reducers provide a lot of eager operations, but not everything.

So yeah, transducers are exactly what you are looking for.

If you call `sequence` with the transducer you get laziness, if you call `into` 
with a collection and a transducer, you get eagerness :).
No decision about the evaluation strategy has to be made up until that point, 
and afaik transducers implement most classical seq constructs.

On 11 Oct 2014, at 21:09, Mars0i <marsh...@logical.net> wrote:

> I don't think I have any misconceptions.  I probably haven't expressed myself 
> clearly.  Clojure has many very useful functions that return lazy sequences.  
> Analogous functions in other languages perform what are exactly the same 
> operations, except for the fact that what's returned is not a lazy sequence, 
> but instead is a different kind of sequential structure.  For example, Common 
> Lisp'smapcar is very much like Clojure's map, but mapcar returns a (non-lazy) 
> singly-linked list.  As you point out, there are also functions in Clojure 
> that return sequential structures that are not lazy.  Moreover, it's easy to 
> convert a lazy sequence into a non-lazy sequence through use of, for example, 
> doall or vec.
> 
> However, writing code in Clojure that only used non-lazy sequences would be 
> unnatural and verbose, as Lee points out.  No one would bother doing that.  
> Part of what's great about Clojure is the convenience of its set of sequence 
> operations.  If you're not using those, you're not getting full benefit from 
> Clojure.  So as a practical matter, one must deal with laziness in Clojure.  
> 
> However, almost the same language could be constructed without any laziness, 
> just by replacing lazy functions such as map with non-lazy analogues.  In 
> that case, you could do all of the same things in those situations that don't 
> require laziness.  (You couldn't use lazy infinite sequences, and you'd have 
> to worry about keeping large data structures in memory, etc.  But in many 
> situations, those features aren't needed.)  
> 
> That's what I mean by "turning off laziness": Replacing every function that 
> returns a lazy sequence with its closest non-lazy analogue.
> 
> On Saturday, October 11, 2014 12:01:34 PM UTC-5, Jan-Paul Bultmann wrote:
> I feel that there are some misconceptions here,
> Clojure is not a language that has lazy evaluation,
> but is instead completely eager.
> Macros are the closest thing that come to laziness, but they are still 
> different.
> However, Clojure has a data structure, that also serves as an abstraction 
> layer,
> that implements laziness, called a sequence or seq.
> 
> Therefor "turning of laziness" makes no real sense. You could say "disable 
> the laziness of seqs",
> but that doesn't really make sense either. It's like disabling the FIFO 
> nature of a queue or a channel.
> If you don't want the properties of a seq, then use another data structure, 
> like a vector.
> 
> 
> On 11 Oct 2014, at 18:14, Mars0i <mars...@logical.net> wrote:
> 
>> Thanks Jan-Paul.  That's helpful.  I wonder whether, if all lazy functions 
>> were rewritten in terms of transducers, it would then be easy to turn 
>> laziness on and off.  (I am not suggesting that this should be done.  No 
>> doubt it would entail a lot of work, and performance tradeoffs.  I'm quite 
>> happy with Clojure as it is, despite anything negative I might say about 
>> impacts of laziness in some circumstances.)
>> 
>> On Saturday, October 11, 2014 5:00:36 AM UTC-5, Jan-Paul Bultmann wrote:
>> Transducers build up transformation steps, with new generic operations like  
>> single arg `map` and `filter`, and then apply these transformations to a 
>> collection using an evaluation function.
>> This function decides if operations are done lazily, eagerly, or on a 
>> channel.
>> 
>> Note that while this makes the place where laziness occurs more obvious, it 
>> is not really new.
>> You can currently infer as well that `map` `filter` `concat` e.t.c are lazy. 
>> While `mapv` or `filterv` are not.
>> 
>> 
>> On 11 Oct 2014, at 00:28, Mars0i <mars...@logical.net> wrote:
>> 
>>> 
>>> 
>>> On Friday, October 10, 2014 5:20:30 PM UTC-5, Mars0i wrote:
>>>  Maybe an ideal world would be one in which there was a global setting to 
>>> turn laziness on and off.  When you want it, have it, and know your risks.  
>>> After looking at the source for some of the lazy functions, I've come to 
>>> suspect that such a feature would be completely nontrivial.
>>> 
>>> Oh, wait, Rich Hickey's blog post about transducers says:
>>> 
>>> But transducers can also be used for:
>>> 
>>>     a la carte laziness
>>>     ...
>>>     collection/iteration/laziness-free transforming reductions 
>>> 
>>> Not certain what this means.  Haven't fully grokked reducers.
>>> 
>>> -- 
>>> 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
>>> 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
>>> 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 toclojure+u...@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 clo...@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+u...@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+u...@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 toclojure+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.

Reply via email to