Man switch

From LSWiki

Jump to: navigation, search

Contents

Synopsis

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 paid attention, a water demon snatches\n"
                 "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";
       }

Bugs

In C, the grammar for switch() is

           switch (expr) block

allowing constructs like

           switch (expr)
             while (expr2)
             {
             case 1: ...
             case 2: ...
             }

The LPC compiler currently can't handle neither statements as switch body, nor case labels embedded in inner loops.

History

LDMud 3.2.9/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.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.

See Also

for(LPC), foreach(LPC), do-while(LPC), if(LPC), while(LPC)

Personal tools