Switch

Georg Wrede georg.wrede at iki.fi
Mon May 18 19:31:37 PDT 2009


bearophile wrote:
> 
> void classify(char c) {
>     write("You passed ");
>     switch (c) {
>        case '#':
>           writeln("a hash sign.");
>           break;
>        case '0' ..> '9':
>           writeln("a digit.");
>           break;
>        case 'A' ..> 'Z', 'a' ..> 'z':
>           writeln("an ASCII character.");
>           break;
>        case '.', ',', ':', ';', '!', '?':
>           writeln("a punctuation mark.");
>           break;
>        default:
>           writeln("quite a character!");
>           break;
>     }
> }
(A bunch of other versions omitted.)...


  void classify(char c) {
      write("You passed ");
      switch (c) {
         case '#':
            writeln("a hash sign.");
            break;
         case '0' .. case '9':
            writeln("a digit.");
            break;
         case 'A' .. case 'Z':
         case 'a' .. case 'z':
            writeln("an ASCII character.");
            break;
         case '.', ',', ':', ';', '!', '?':
            writeln("a punctuation mark.");
            break;
         default:
            writeln("quite a character!");
            break;
      }
  }

This is usable, easy to read -- and the programmer has no problem to 
remember that .. works differently in case statements than in ranges.

There are other places in D that place an undue burden on the 
programmer, but this is not IMHO one of them.

--------------------

My pet peeve with case is that, since we don't seem to be getting rid of 
break (and use some word for fall-through instead, "which would save a 
good deal of ink"), we should at least try to make break more 
conspicuous. I can name a hundred times I've forgotten a break from 
somewhere. So the canonical indentation should be like this:


  void classify(char c) {
      write("You passed ");
      switch (c) {
         case '#':
            writeln("a hash sign.");
         break;
         case '0' .. case '9':
            writeln("a digit.");
         break;
         case 'A' .. case 'Z':
         case 'a' .. case 'z':
            writeln("an ASCII character.");
         break;
         case '.', ',', ':', ';', '!', '?':
            writeln("a punctuation mark.");
         break;
         default:
            writeln("quite a character!");
         break;
      }
  }

(It'd look better when the cases have more lines, but still.) Currently 
in D, break is at least as important as case, therefore it deserves a 
conspicuous place, hence my suggestion.



More information about the Digitalmars-d mailing list