tcak:
Well, that's just disguising what we can't do.
When the a..b syntax was added to foreach() someone criticized
that syntax saing it's a "one trick pony", and indeed I don't
know why Walter didn't make it a little more first-class.
But note that in D the a..b ranges are always open on the right,
so 'a'..'z' can't include the 'z'.
What do you think of this?
import std.stdio, std.range, std.algorithm, std.array;
auto charInterval(in char a, in char b) pure nothrow @safe @nogc {
return iota(a, b + 1).map!(i => cast(char)i);
}
void main() @safe {
char[] arr = chain(charInterval('a', 'z'),
charInterval('A', 'Z'),
charInterval('0', '9')).array;
arr.writeln;
}
charInterval can of course become eager too, so you just need ~
to concatenate the results:
import std.stdio, std.range, std.algorithm, std.array;
char[] charInterval(in char a, in char b) pure nothrow @safe {
return iota(a, b + 1).map!(i => cast(char)i).array;
}
void main() @safe {
char[] arr = charInterval('a', 'z') ~
charInterval('A', 'Z') ~
charInterval('0', '9');
arr.writeln;
}
Bye,
bearophile