Compile Time Fun Time
Simen Kjærås
simen.kjaras at gmail.com
Mon Feb 25 07:40:51 UTC 2019
On Monday, 25 February 2019 at 06:51:20 UTC, Yevano wrote:
> This only works for at most 3 parameter delegates. If I want to
> add more, I have to linearly add more static ifs in the obvious
> way. However, I believe I can make this function scalable using
> string mixins and other magic. Any insight into this is much
> appreciated.
The simple scalable version - just change maxArgs to a number
that suits you:
Abstraction L(alias f)() {
import std.meta : Repeat;
enum maxArgs = 20;
static foreach (i; 0..maxArgs) {
static if (__traits(compiles, f(Repeat!(i, null)))) {
Repeat!(i, Variable) vars;
foreach (ref e; vars) {
e = new Variable();
}
auto result = new Abstraction(vars[0], f(vars));
foreach (e; vars[1..$]) {
result = new Abstraction(e, result);
}
return result;
}
}
}
The problem with lambdas is they only present an opaque name when
inspected with .stringof, so you can't easily check the arity.
For regular templated functions it can be done, but requires
parsing some substantial subset of D code.
--
Simen
More information about the Digitalmars-d-learn
mailing list