On Wednesday, 24 April 2013 at 23:42:57 UTC, Idan Arye wrote:
Token strings solve all the problems the OP mentioned, but they
do not solve the one problem he didn't mention - closures:
int[] array = [3, 1, 5, 2, 7];
int x = 4;
writeln(array.filter!(a => a < x)()); // works as expected
and prints "[3, 1, 2]"
writeln(array.filter!q{a < x}()); // Error: undefined
identifier x
Yeah, it was unfortunate that the problems I exemplified could be
solved by the token strings, without fulling solving the problem,
making the issue seem more superficial than it is. Your example
is better.
Notice that my code worked for your example, if you changed it to
match your scenario:
// we have to move this outside of main,
// because the mixin template cannot be there
int[] array;
int x = 4;
mixin template Greater() {
auto Greater = () => a < x;
}
(...)
This seems to work. So, as I said, the infrastructure is there,
we are just lacking the convenience of template mixin literals.
Without that we have this unwieldy code, which otherwise seems
fine.