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