Questions about the slice operator

bearophile bearophileHUGS at lycos.com
Tue Apr 3 18:49:26 PDT 2012


ixid:

> I understand the basic use to slice an array but what about 
> these:
>
> foreach(i;0..5)
>     dostuff;
>
> That works yet this does not:
>
> foreach(i;parallel(0..5))
>     dostuff;
>
> Why not let this work? It'd seem like a natural way of writing 
> a parallel loop.

The design of D language is a bit of a patchwork, it's not very 
coherent. So the ".." notation defines an iterable interval only 
in a foreach (.. is used for switch cases too, but it includes 
the closing item too).
Generally a "patchwork design" has some clear disadvantages, but 
it often has some less visible advantages too.
With other people I have suggested few times for a..b to denote a 
first-class lazy range in D, but Walter was not interested, I 
guess. I'd like this, but using iota(5) is not terrible (but keep 
in mind that iterating on an empty interval gives a different 
outcome to iterating on an empty iota. I have an open bug report 
on this).


> For some reason:
>
> foreach(i;[0,1,2,3,4])
>     dostuff;
>
> This performs far more slowly than the first example

I don't know why, but maybe the cause is that an array literal 
like that induces a heap allocation. This doesn't happen with the 
lazy 0..5 syntax.


> If it can do what it does in the first example why not let it 
> do something like this:
>
> int[] arr = 0..5; //arr = [0,1,2,3,4]

Because a..b is not a first-class interval, because lazyness and 
ranges were  introduced quite late in D and not since the 
beginning of its design, so lazy constructs are mostly 
library-defined and they don't act like built-ins.


> One final thought- why is the array function required to 
> convert a lazy Result to an eager one? If you explicitly set 
> something like int[] blah = lazything why not have it silently 
> convert itself?

Beside the answers I've already given, generally because implicit 
conversions are often a bad thing. Requiring some syntax to 
denote the lazy->eager conversion is positive, I think I don't 
know of a language that perform such conversion implicitly.

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list