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