On Thu, Jan 6, 2011 at 2:51 PM, Dave Abrahams <dave@boostpro.com> wrote:
At Thu, 6 Jan 2011 13:23:11 +0000,
Robert Jones wrote:
>
> Yes.... I take your point about eager vs lazy, but on reflection is it not
> the case that almost any 'pipeline' of transformations has to end with
> 'eager' consumption?

No, it is not.  In some languages, everything is lazy, and the only
thing that eventually forces evaluation is I/O.  You can easily pass
around, store, and compose lazy ranges to your heart's content.

> If I had
>
> int f( int );
>
> boost::for_each( vec | boost::adaptors::reversed | boost::adaptors::uniqued,
> f );
>
> and instead were able to write it as
>
> vec | boost::adaptors::reversed | boost::adaptors::uniqued | f;
>
> the final use of operator|() seems to pretty much imply eagerness in the
> same way that the for_each() does.

Only if you happen to know that f is a function and will be treated
completely differently from the range adaptors.


Absolutely, now we're on the same page. There must be some identifiable quality
of the last element of the pipeline that indicates that it is a consumer of the
elements of the range. I'm unsure that any such reasonable test could be
devised, which is what makes such a facility hard to write.

Just musing on this.... if the 'thing' is a function-like object that accepts arguments
of the type of elements of the range (or convertible), could it be reasonably assumed
to consume the range?

- Rob.