On 1/21/11 7:35 PM, Tomek Sowiński wrote:
Andrei Alexandrescu napisał:
Like I said, anything that doesn't bother to expose range-interfaced iterators
and is not performance critical is
considered a target for ad hoc ranges. Working with non-D libraries, or
libraries ported to D but preserving
mother-language idioms. Tasks like traversing a tree of GUI widgets, or
business specific objects where defining
proper ranges rarely happens and is use-case driven in practice. I expect they
could be of some use in unittesting
as mock input. Vaguely related: educational -- ad hoc ranges read almost like a
for loop so the learning curve for
ranges in general is eased off.
Adding them to Phobos is an interesting idea. We need to evaluate their worth,
though.
Everybody: if you could write up a one-liner like range(empty, popFront,
front), what would you use it for?
How about a singleton range - a range with exactly one element. It could
be done with repeat(x, 1) but let's try it with your function as a
warm-up exercise.
If x is nullable, range(x, x=null, x); it destroys x, though. Otherwise the
state must be held separately on the stack.
bool empty;
auto r = range(empty, empty=true, x);
So repeat(x, 1) wins this one. I think such nuggets can better be expressed as
a degenerate case of existing facilities. I envision ad hoc ranges at places
where no iteration is defined and a one-off range struct doesn't pay. Like
database-backed entities which don't conform to any clear-cut data structure,
but if you squint you see it's sort of a tree, and you may just be able to e.g.
walk through children recursively fetching only active ones from DB, traverse
columns of interest, and dump their content to a grid component which takes an
arbitrary range of values. And all this can be wrapped in std.parallelism to
overlap DB round trips.
I think the challenge here is to figure out where to store the state.
The idiom makes it difficult for the delegates to communicate state to
one another.
Andrei