foreach multiple loop sugar

TheHamster via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Aug 18 09:31:29 PDT 2015


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...


More information about the Digitalmars-d-learn mailing list