It’s the language, silly
David Shay complains about a strange looking loop:
It looks like this:
do { ... } while (false);A loop that runs once. What’s the point of it? Well, the guy used this trick so that he can simulate a
GOTOby calling a simplebreakcommand. How ugly is that? I advised my colleague to put the body of the loop in a separated method, and callreturninstead.
Actually, that idiom is not ugly at all, nor is it a GOTO any more than return is, as evidenced by the fact that the suggested transformation to a function is completely formulaic.
What’s ugly is that the language does not offer actual naked blocks as in
{
// ...
if( condition ) break;
// ...
}
so that you have to resort to that silly do { ... } while( 0 ); trick.
Perl does offer naked blocks, and I find myself using them quite a bit. I also find them to be invaluable tools in structuring my code.
Even GOTO isn’t inherently evil. That certainly doesn’t mean I use it much – not once in 500,000 lines of code. It’s just dangerous, not evil. Certain kinds of state machines or parsers f.ex can be much easier to write and read with a few carefully sprinkled GOTOs.