No more fall through in case statement?

bearophile bearophileHUGS at lycos.com
Thu Jan 3 05:05:07 PST 2008


Bill Baxter:
> I'm no C# guy but that looks like a nice way to fix C's switch.

I think the C switch is broken in 2 or more ways, so I'd like to see D improve it. This is some code I have shown time ago:

import std.stdio: writefln;
void main(string[] args) {
  switch (args[1]) {
    int x = 1; // NOT initialized?
    case "1": writefln("1! x=", x); break;
    case "2": writefln("2! x=", x); break;
  }
}

More on switch-induced bugs:
http://www.soft.com/AppNotes/attcrash.html


>"goto case 5" looks like something straight out of Walter's playbook, too.<

I don't like that goto too much... You usually just want do go down (and by default you want to go to the end of the switch).


> But it's been discussed many times now and it doesn't seem likely Walter's going to change it in D.<

I agree with Walter when he says it's better that if a syntax that looks like C works like C (D goes against this rule few times). So we need a syntax that looks different. Instead of switch{} it may be used caseof{}, plus the "default" statement, plus a new statement like "fall" (or something similar) that tells the compiler just to not break, so it's just the opposite of C :-)

As example, this is a part of the std.string.capwords function:

switch (s[i]) {
    case ' ':
    case '\t':
    case '\f':
    case '\r':
    case '\n':
    case '\v':
        if (inword) {
            r ~= capitalize(s[istart .. i]);
            inword = false;
        }
        break;

    default:
        if (!inword) {
            if (r.length)
            r ~= ' ';
            istart = i;
            inword = true;
        }
        break;
}


With that syntax it becomes:

caseof (s[i]) {
    case ' ':  fall;
    case '\t': fall;
    case '\f': fall;
    case '\r': fall;
    case '\n': fall;
    case '\v':
        if (inword) {
            r ~= capitalize(s[istart .. i]);
            inword = false;
        }

    default:
        if (!inword) {
            if (r.length)
            r ~= ' ';
            istart = i;
            inword = true;
        }
}


D already follows such "inversion rule" regerding C in some cases, like here:

int a = void;

In a safe(r) language the default syntax/behavior *must* be the safer one, expecially when this has no/little costs in terms of speed/memory.

Bye,
bearophile



More information about the Digitalmars-d mailing list