Function called twice

Boris Carvajal boris2.9 at gmail.com
Fri Aug 2 22:45:50 UTC 2019


On Friday, 2 August 2019 at 21:44:28 UTC, Jordan Wilson wrote:
> Hello,
>
> I don't quite understand why isEven is called twice in the 2nd 
> example?
>
> auto isEven(int n) {
> 	n.writeln;
> 	return (n % 2) == 0;
> }
>
> void main() {
>
> 	auto z = [1,2,3];
> 	
> 	// outputs 1 2 3
> 	z.map!(a => tuple!("number")(a))
> 	 .filter!(a => a.number.isEven)
> 	 .array;
>
> 	// outputs 1 2 2 3
> 	z.map!(a => tuple!("number","iseven")(a, a.isEven))
> 	 .filter!(a => a.iseven)
> 	 .array;
>
> 	return;
> }
>
> Thanks,
>
> Jordan

The way map is designed is to call its predicate on each front 
call and filter calls it twice with the number 2.
https://github.com/dlang/phobos/blob/master/std/algorithm/iteration.d#L604

You can use "cache" to avoid the double front call on any range.

z.map!(a => tuple!("number","iseven")(a, a.isEven))
          .cache
  	 .filter!(a => a.iseven)
	 .array;



More information about the Digitalmars-d-learn mailing list