On the subject of map
taking the function as template parameter, I was surprised to see it could still be used with functions determined at runtime, even closures, etc. I am trying to understand the mechanism behind it.
The commented out line causes the error that choice(funcs)
cannot be determined at compile time, which is fair, but how is it not the same case for func
two lines above? I thought it might be because the functions are literals visible at compile time, but the closure makes that dubious.
import std.stdio;
import std.algorithm;
import std.random;
void main()
{
int r = uniform(0,100);
int delegate(int)[] funcs = [
x => x * 2,
x => x * x,
x => 3,
x => x * r // Closure
];
auto foo = [1,2,3,4,5];
foreach(i; 0..10)
{
// This is fine:
auto func = funcs.choice;
writeln(foo.map!func);
// This is not?
// writeln(foo.map!(funcs.choice));
}
}
In fact, how can the template be instantiated at all in the following example, where no functions can possibly be known at compile time:
auto do_random_map(int delegate(int)[] funcs, int[] values)
{
auto func = funcs.choice;
return values.map!func;
}
Thank you for the insights!