redundant C-style switch; (was: simple shorter function syntax)
Daniel Friesen
lists at nadir-seen-fire.com
Tue Jul 27 21:33:01 PDT 2010
Dmitry A. Soshnikov wrote:
> ...
>
> Also I think JS still has some redundant C-syntax garbage. For
> example, that "break" keyword each time in "case" of a "switch" -- for
> what it is there? For what to write several times "case-case-case" if
> it's possible to write it once and separate testing operands with a
> colon? Moreover, this "switch" construct is non-logical in control
> flow if to place "default" not in the end or to forget this "break"
> garbage. Why on earth if I have x = 5 and "case 5:" should I catch
> also "case 6:" if I forgot that useless "break" garbage there? So I
> like better Ruby's or Coffee's way, e.g.
> http://jashkenas.github.com/coffee-script/#switch Btw, there're many
> good syntax sugars which Harmony can borrow (I know some of them are
> already planned and it's very good, but maybe others too).
>
> ...
> Dmitry.
Since you pointed out the redundant switch style, that too has been
bothering me. Personally I have one issue with ruby's case/with, you can
easily write out multiple with statements in case style with no warning
thinking they work case style... I was bitten by that once, didn't
realize for a while that portions of my code weren't being executed.
Personally, my ideal switch would be something like:
blockname:
switch(variable) {
case "a", "A", "Aa": { // instead of break; we use a block
print("- Alpha");
}
case "b", "B", "Beta": print("- B"); // Like if and other things lack of {} only applies to a single expression and breaks out.
case "g", "G": {
print("- Gamma");
break; // leaves the switch
}
case "o", "O": {
print("- Omega");
continue "a"; // instead of ugly fallthrough case logic continue could be used to jump to the other block
// Though, considering `continue foo;` ambiguity I'd expect this would probably require a slightly different syntax `continue blockname, "a";` or something.
}
}
The idea came to me after a small misunderstanding about Java's
switch/case... I was looking at Rhino's source code and it had code
style with switch/case which may have lacked break only due to the use
of return, but it did give me ideas, and there have been various times
while practically coding switch statements where I really wished instead
of using ugly break-less case logic I could use continue, so those
together lead to this syntax idea.
Of course given backwards compatibility (in terms of not suddenly making
existing switch/case code break), and implementation burdens, and taking
a bit of inspiration from Ruby I think this format would be a good
revised version of that with a bit of even better shortening.
blockname:
case(variable) {
"a", "A", "Aa": {
print("- Alpha");
}
"b", "B", "Beta": print("- B"); // Like if and other things lack of {} only applies to a single expression and breaks out.
"g", "G": {
print("- Gamma");
break; // leaves the switch
}
"o", "O": {
print("- Omega");
continue blockname, "a";
}
}
case isn't valid outside of switch, so all you'd have to do is check if
it is directly followed by ( and if so switch to the new syntax. You get
an extra advantage of eliminating unnecessary case keywords, and also
end up with a syntax mildly resembling that of a object literal that
aligns nicely with case.
continue is key though, adding it preserves abilities lost by the
conversion from swtich/case and also improves what you can do with the
statement logic.
--
~Daniel Friesen (Dantman, Nadir-Seen-Fire) [http://daniel.friesen.name]
More information about the es-discuss
mailing list