map question

Stanislav Blinov stanislav.blinov at gmail.com
Sat Jan 22 19:55:43 UTC 2022


On Saturday, 22 January 2022 at 19:32:07 UTC, forkit wrote:
> trying to make sense of the below:
>
>
> // ---
> module test;
>
> import std;
>
> void main()
> {
>     auto rnd = Random(unpredictableSeed);
>
>     int howManyTimes = 5;
>
>     // ok - using 'e =>' makes sense
>     writeln(howManyTimes.iota.map!(e => rnd.dice(0.6, 
> 1.4)).format!"%(%s,%)");
>
>     // ok - though using 'howManyTimes =>' doesn't make much 
> sense??
>     writeln(howManyTimes.iota.map!(howManyTimes => 
> rnd.dice(0.6, 1.4)).format!"%(%s,%)");
>
>     // NOT ok - using '5 =>' - but isn't this effectively the 
> same as above line?
>     //writeln(howManyTimes.iota.map!(5 => rnd.dice(0.6, 
> 1.4)).format!"%(%s,%)");
> }
>
> // ---

No, it's not the same. 'Tis not really a "map question", looks 
more like a question about

https://dlang.org/spec/expression.html#function_literals (see 
#10).

In the second case, you're defining a lambda with single 
parameter named `howManyTimes`, which is not at all related to 
your local variable of the same name. Third case is invalid, as 
you're effectively trying to do this:

auto func(T)(T 5) { return rnd.dice(0.6, 1.4); }

Which, of course, doesn't make any sense, does it? :)

Given your use case (call a function N times), I think `generate` 
would be more appropriate here:

```d
import std.random;
import std.stdio;
import std.range : generate, take;

void main()
{
     auto rnd = Random(unpredictableSeed);
     int howManyTimes = 5;
     generate!(() => rnd.dice(0.6, 
1.4)).take(howManyTimes).writeln;
}

```


More information about the Digitalmars-d-learn mailing list