mirror of
https://github.com/ldmud/ldmud
synced 2026-08-12 14:26:05 -04:00
Switch now explicitly expects case/default statements in the switch
block and puts the non-case statements afterwards into their own
block scope. (Bug #584)
git-svn-id: svn://svn.bearnip.com/ldmud/trunk@2454 56160b6e-f8f8-0310-bd54-bccebfe6a2f2
93 lines
3.1 KiB
Text
93 lines
3.1 KiB
Text
NAME
|
|
switch
|
|
|
|
SYNTAX
|
|
switch (expr) block
|
|
|
|
DESCRIPTION
|
|
Branch to the case label in statement that matches expr.
|
|
If no matching case label is found (by value or by type),
|
|
branch to the default label in statement.
|
|
|
|
A case label has the form
|
|
|
|
case expr_n :
|
|
|
|
where expr_n must be constant, or the form
|
|
|
|
case expr_n1 .. expr_n2 :
|
|
|
|
where expr_n1 and expr_n2 must be numeric constants and
|
|
expr_n1 < expr_n2.
|
|
|
|
Either all case labels have to be strings or all have to be
|
|
numeric. Only 0 is special: it is allowed in a switch
|
|
statement where all other labels are strings.
|
|
|
|
A default label has the form
|
|
|
|
default :
|
|
|
|
The default label defaults to the end of statement if not
|
|
given explicitly.
|
|
|
|
Whenever a 'break' statement is executed inside 'statement' a
|
|
branch to the end of the switch statement is performed.
|
|
|
|
EXAMPLE
|
|
Typical usage:
|
|
|
|
switch(random(100)) {
|
|
case 0 .. 22 : write("Nothing happens"); break;
|
|
case 23 .. 27 :
|
|
write("You are surrounded by a golden glow");
|
|
this_player()->heal_self(random(3));
|
|
break;
|
|
case 28 .. 32 :
|
|
write("The water was poisoned!\n");
|
|
this_player()->add_exp(this_player()->hit_player(random(4)));
|
|
break;
|
|
case 33 : write("You hear a voice whispering: "+random_hint());
|
|
/* fall through */
|
|
case 34 :
|
|
write("While you didn't pay attention, a water demon "
|
|
"snatches a coin out of your purse!\n");
|
|
this_player()->add_money(-1);
|
|
break;
|
|
default : write "You hear some strange noises\n"; break;
|
|
case 42 : return;
|
|
case 99 : write("It tastes good.\n";
|
|
}
|
|
|
|
NOTE
|
|
In C, the grammar for switch() is
|
|
|
|
switch (expr) statement
|
|
|
|
allowing constructs like
|
|
|
|
switch (expr)
|
|
while (expr2)
|
|
{
|
|
case 1: ...
|
|
case 2: ...
|
|
}
|
|
|
|
In LPC a switch has to be followed by a block that contains the
|
|
case labels directly. In contrast to C the group of statements
|
|
following a case label have their own lexical scope so that
|
|
variable declarations may not cross case labels.
|
|
|
|
HISTORY
|
|
LDMud 3.2.10 constrained the grammar to require a block for the
|
|
switch() body, not just a statement. This differs from the C
|
|
syntax, but was necessary as the compiler didn't handle
|
|
the statement case correctly.
|
|
LDMud 3.3 allowed to pass values of the wrong type to switch(), the
|
|
driver would in that case use the default case. Before, values of
|
|
the wrong type caused a runtime error.
|
|
LDMud 3.3.718 disallowed case labels in inner blocks and variable
|
|
declarations that cross case labels.
|
|
|
|
SEE ALSO
|
|
for(LPC), foreach(LPC), do-while(LPC), if(LPC), while(LPC)
|