is std.algorithm.joiner lazy?

Edwin van Leeuwen via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Apr 7 01:07:12 PDT 2016


On Thursday, 7 April 2016 at 07:07:40 UTC, Puming wrote:
> Hi:
>
> when I use map with joiner, I found that function in map are 
> called. In the document it says joiner is lazy, so why is the 
> function called?
>
> say:
>
> int[] mkarray(int a) {
>    writeln("mkarray called!");
>    return [a * 2]; // just for test
> }
>
> void main() {
>    auto xs = [1, 2];
>    auto r = xs.map!(x=>mkarray(x)).joiner;
> }
>
> running this will get the output:
>
> mkarray called!
> mkarray called!
>
> I suppose joiner does not consume?
>
> when I actually consume the result by writlen, I get more 
> output:
>
> mkarray called!
> mkarray called!
> [2mkarray called!
> mkarray called!
> , 4]
>
> I don't understand

Apparently it works processing the first two elements at 
creation. All the other elements will be processed lazily.

Even when a range is lazy the algorithm still often has to 
"consume" one or two starting elements, just to set initial 
conditions. It does surprise me that joiner needs to process the 
first two, would have to look at the implementation why.


More information about the Digitalmars-d-learn mailing list