On Tuesday, 18 August 2015 at 15:51:55 UTC, ixid wrote:
Though sugar seems to be somewhat looked down upon I thought
I'd suggest this- having seen the cartesianProduct function
from std.algorithm in another thread I thought it would be an
excellent piece of sugar in the language. It's not an earth
shattering change but it makes something very common more
elegant and reduces indentation significantly for multiple
nested loops. Braces make nested loops very messy and any
significant quantity of code in the loop body benefits from not
being in a messy nesting.
import std.algorithm, std.range, std.stdio;
void main() {
// Standard
foreach(i; 0..10)
foreach(j; 0..10)
foreach(k; 0..10)
writeln(i, j, k);
// Better
foreach(k, j, i; cartesianProduct(10.iota, 10.iota, 10.iota))
writeln(i, j, k);
// Sugar
foreach(k, j, i; 0..10, 0..10, 0..10)
writeln(i, j, k);
//Following brace rules
// Standard
foreach(i; 0..10)
{
foreach(j; 0..10)
{
foreach(k; 0..10)
{
writeln(i, j, k);
}
}
}
// Sugar
foreach(k, j, i; 0..10, 0..10, 0..10)
{
writeln(i, j, k);
}
You can create a multi-loop quite easily in template form for
avoid the nesting.
Essentially use an array for the the index instead of individual
variables, e.g.,
mutliloop([0..10, 0..10, 0..10], (i)=>
{
writeln(i[0], i[1], i[2]);
});
I'm not sure how efficient it is but essentially achieves what
you are asking without too much overhead. Obviously having good
language support is always nice...