Another switch suggestion.
Stewart Gordon
smjg_1998 at yahoo.com
Fri Sep 1 10:58:45 PDT 2006
Fredrik Olsson wrote:
> As the switch syntax already allows for more funky stuff than C does,
> that requires some kind of code to be inserted why not extend on it a
> bit and allow for say:
>
> switch (foo) {
> case ($ >= 'a' && $ <= 'z') || ($ >= 'A' && $ <= 'Z'):
> doStuff();
> break;
> default:
> doOtherStuff();
> break;
> }
>
> Just as $ means "length of array" for slicing an array and such, why not
> let $ mean "the value the current switch is testing for"?
What if you want to include the value being tested as an array index?
> And if the
> case have a boolean expression instead of a constant than the first case
> that evaluates to true should be run.
Why restrict switch to boolean expressions and constants? Moreover,
what about boolean constants - constants are still expressions, aren't
they? Before I got this far, I'd figured that if a '$' is present then
it would compare it with true, otherwise it would compare the input
value with the value of the case expression.
I'm not sure I like your idea really. Moreover, suppose you have this:
switch (qwert) {
case $ > 42:
doStuff();
break;
case yuiop[69..$] > 105;
doOtherStuff();
}
then what would make sense?
(a) to treat $ in the second case as being the value of qwert, and to
pass if the expression evaluates to true?
(b) to treat $ in the second case as the length of yuiop, and because
the whole thing is still a boolean expression, see if it's true (thereby
not using qwert at all)?
(c) to treat $ in the second case as the length of yuiop, and notice
that the expression doesn't depend on $ in its meaning of the switched
value and therefore compare qwert with the boolean value of the expression?
Moreover, your code could just as easily be written
if ((foo >= 'a' && foo <= 'z') || (foo >= 'A' && foo <= 'Z')) {
doStuff();
} else {
doOtherStuff();
}
OK, so foo might be a whole expression, which might have a side effect
or be cumbersome to write out each time. But it's probably just as
efficient to assign the result to a variable first and use if statements
as it would be to do what you're proposing.
> One of the few features I miss from Visual Basic :).
>
> And an even better syntax for the above example would naturally be:
> switch (foo) {
> case $ in <'a'..'z', 'A'..'Z'>:
<snip>
Why have the '$' at all for this syntax? Or are you trying to propose a
whole new expression syntax to be used in more than just cases? Using
'<' and '>' for anything but comparison operators is bound to lead to
parsing complications. That's why templates don't use this notation.
Stewart.
--
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/M d- s:-@ C++@ a->--- UB@ P+ L E@ W++@ N+++ o K-@ w++@ O? M V? PS-
PE- Y? PGP- t- 5? X? R b DI? D G e++++ h-- r-- !y
------END GEEK CODE BLOCK------
My e-mail is valid but not my primary mailbox. Please keep replies on
the 'group where everyone may benefit.
More information about the Digitalmars-d
mailing list