Heap: container or range?
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Fri Jan 30 11:58:47 PST 2009
Denis Koroskin wrote:
> Sergey Gromov Wrote: [snip]
>> OTOH, I'd expect something like the following to also work:
>>
>> auto f = new File("blah.txt"); auto top = take(10, f.lines);
>>
>
> Same here. I feel that take (and some other adaptors) should accept
> range by reference. One of the advantages of ranges over opApply is
> that you can start foreach, break somewhere (throw an exception,
> recover) and then continue. It also means that the range is mutated
> inside foreach. If foreach mutates the range, so can other algorithms
> that operate on ranges do.
While I'm not 100% clear on what take should do, this particular
argument is not that compelling. I really mean not compelling at all.
Consider:
int[] a = [ 1, 2, 3, 4, 5];
foreach (e; a)
{
if (e == 3) break;
}
assert(a == [4, 5]);
Do you seriously expect that to be the case? Of course not. However, you
would inconsistently expect this to happen:
int[] a = [ 1, 2, 3, 4, 5];
foreach (e; take(4, a))
{
if (e == 3) break;
}
assert(a == [4, 5]);
Ranges are modeled to correspond to slices. Slices have few operations
that manipulate them by reference (notably the controversial ~=) and
range are made to be unsurprising when compared to slices. They are
really extensions of slices.
Andrei
More information about the Digitalmars-d
mailing list