| 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) |