continue in labeled switch

monkyyy crazymonkyyy at gmail.com
Sat Jul 5 17:35:31 UTC 2025


On Saturday, 5 July 2025 at 10:18:28 UTC, Nick Treleaven wrote:
> On Saturday, 5 July 2025 at 02:27:33 UTC, monkyyy wrote:
>> from the 2026 update for zig he showed off labeled switches
>> https://youtu.be/x3hOiOcbgeA?si=rr69iKJOZ2CyKysi
>>
>> ```d
>> foo: switch(0){
>>   case 0:
>>     "hi".writeln;
>>     continue foo(2);
>>   case 1:
>>     "bye".writeln;
>>     break;
>>   case 2:
>>     "hello".writeln;
>>     continue foo(1);
>>   default: assert(0);
>> }
>> ```
>> would print "hi","hello","bye" this is probably the majority 
>> of my uses of goto
>
> Why is that better than using `goto case 1;`, `goto case 2;`?
>
> https://dlang.org/spec/statement.html#goto-statement
>
> Using `continue` for this seems like unnecessary keyword 
> meaning overloading, given that AIUI `continue;` still refers 
> to loop statement iteration, and a labelled switch lowers to a 
> while loop(!):
>
>>  Semantically, this is equivalent to the following loop:
>
> https://ziglang.org/documentation/master/#toc-Switching-with-Enum-Literals
>
> So it seems using `continue;` would silently restart the 
> labelled switch statement, probably causing an infinite loop 
> (if the implementation matches the spec). Or probably that 
> is/will be a compile error, in which case labelled switch has 
> limitations versus unlabelled switch.
>
> Also is there a `continue foo(default);`? Having `goto 
> default;` is better than having to write e.g. `continue 
> foo(3);`, because `case 3:` could be added later, and jumping 
> to the default case may have been the intended target - 
> updating the latter code can easily be forgotten, especially 
> for a long switch statement.

```d
void collez(int i){
	final switch(i%2){
		case 0:
			i/=2;
			goto case (i%2); //error
		case 1:
			i*=3;i++;
			goto case (i%2);
}}
```

reusing the switch machinery



More information about the dip.ideas mailing list