Georg Wrede wrote:
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.

I'd like to keep the (non-required) colon after the first expression in a ".." pair of case labels, that is:

case '0': .. case '9':

as opposed to

case '0' .. case '9':

That way it is abundantly clear that the notation has nothing in common with expression1 .. expression2. The error message if someone forgot the ':' can easily be made clear.


Andrei

Reply via email to