goto a no-go?

monarch_dodra monarchdodra at gmail.com
Tue Oct 1 05:36:23 PDT 2013


On Tuesday, 1 October 2013 at 11:47:37 UTC, John Colvin wrote:
> On Tuesday, 1 October 2013 at 11:40:35 UTC, Manu wrote:
>> I'd say 90% of the time I find goto useful is when I need to 
>> bail from
>> nested loops. I've often wondered if something like break(2) 
>> would be a
>> more elegant solution to the breaking out of nested loops 
>> problem.
>
> labeled statements to the rescue!
>
> 	outer: foreach(i; 0..10)
> 	{
> 		foreach(j; 0..10)
> 		{
> 			break outer;
> 		}
> 	}

break outer; Obsoletes one of my "only" use cases where before, I 
would have used a goto instead:

	foreach(i; 0..10)
	{
		foreach(j; 0..10)
		{
			goto double_break;
		}
	}
	double_break: {}

It's awesome.

Too bad you can't break from an arbitrary block though. It can 
help avoiding the dreaded "if(if(if(if(...))))" pattern, as well 
as the "bool didYouDoIt" pattern. I still have to use my "goto 
after_block" pattern :/
//----

//Search and deal with a specific condition
//While doing something special if the condition is not found.
{
     if (some_condition) goto block_end; //No need to do anything
     if (some_other_condition) goto block_end; //No need to do 
anything
     if (some_third_condition) goto block_end; //No need to do 
anything

     for (...)
     {
         for (...)
         {
             if (...)
             {
                 do_processing();
                 goto block_end; //We found what we wanted.
             }
         }
     }

     do_code_for_not_found_here();
}
done_processing: {}
//Keep going here

//----

I guess I can always use the "do{}while(false);" pattern, but I 
actually find it *more* confusing (IMO)


More information about the Digitalmars-d mailing list