Jonathan M Davis: >Well, I would pount out that you mentioning it more or less reopens the >discussion,<
You are right, but probably Walter will not sue me for reopening an old thread ;-) In the things you are saying you seem to ignore the "goto" I have written two times in my answers :-) >An extension of that is if you have two cases which are almost identical but >where one of them needs to do something first before the code that is common >between both cases.< You can write this C-style switch: switch (x) { case 0: foo(); case 1: bar(); } As this (this is D syntax that you can already use): void main() { int x, y; switch (x) { case 0: y++; goto case 1; case 1: y++; default: } } > A more complicated example would be one where you're doing something like > Duff's Device: > > send(to, from, count) > register short *to, *from; > register count; > { > register n=(count+7)/8; > switch(count%8){ > case 0: do{ *to = *from++; > case 7: *to = *from++; > case 6: *to = *from++; > case 5: *to = *from++; > case 4: *to = *from++; > case 3: *to = *from++; > case 2: *to = *from++; > case 1: *to = *from++; > }while(--n>0); > } > } You can use gotos (this is a different function, it copies whole arrays, 'to' too is incremented): import std.stdio: writeln; void arrryCopy(short* to, short* from, int count) { foreach (_; 0 .. count / 8) { *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; } final switch (count % 8) { case 7: *to++ = *from++; goto case 6; case 6: *to++ = *from++; goto case 5; case 5: *to++ = *from++; goto case 4; case 4: *to++ = *from++; goto case 3; case 3: *to++ = *from++; goto case 2; case 2: *to++ = *from++; goto case 1; case 1: *to++ = *from++; break; case 0: break; } } void main() { short[9] a1 = 1; short[a1.length] a2; writeln(a1, " ", a2); arrryCopy(a2.ptr, a1.ptr, a1.length); writeln(a1, " ", a2); } I have used the static switch to avoid the default case. Using gotos like that is a bit less conventient than the C code, but I think it can be acceptable. > switch(value) > { > case 0: > do something... > case 1: > do something else... > case 2: > do a third thing... > case 3: > do yet more... > } You can translate it as: switch(value) { case 0: do something... goto case 1; case 1: do something else... goto case 2; case 2: do a third thing... goto case 3; case 3: do yet more... break; default: ... } Bye, bearophile