diff options
Diffstat (limited to 'Switch')
| -rw-r--r-- | Switch/README.md | 46 | ||||
| -rw-r--r-- | Switch/switch.b | 72 |
2 files changed, 118 insertions, 0 deletions
diff --git a/Switch/README.md b/Switch/README.md new file mode 100644 index 0000000..92be1f4 --- /dev/null +++ b/Switch/README.md @@ -0,0 +1,46 @@ +# Switch + +Limbo does not have a verbatim `switch` statement. Rather, it has a statement named `case` which is analogous, but not identical to C's switch-case construct. + +Limbo case statements break by default and accept range matching operations involving the `or` and `to` keywords. + +Note: A break or continue followed by a label causes a break out of, or the next iteration of, the enclosing construct that is labeled with the same label. + +## Source + +### switch.b:16,31 + + + +### switch.b:33,42 + + + +### switch.b:44,51 + + + +### switch.b:53,60 + + + +### switch.b:62,69 + + + +## Demo + + ; limbo switch.b + ; switch + Even + Odd + i's value: 9 + Valid hex + Quack! + This is binary + Neither 4 nor 7 + ; + +## Exercises + +- Try commenting out the `break` and/or `continue` keywords in the first switch, how does the behavior change? diff --git a/Switch/switch.b b/Switch/switch.b new file mode 100644 index 0000000..a25220c --- /dev/null +++ b/Switch/switch.b @@ -0,0 +1,72 @@ +implement Switch; + +include "sys.m"; +include "draw.m"; + +sys: Sys; +print, FD: import sys; + +Switch: module { + init: fn(nil: ref Draw->Context, nil: list of string); +}; + +init(nil: ref Draw->Context, nil: list of string) { + sys = load Sys Sys->PATH; + + i := 10; + + # The label labelling the enclosing construct + loop: + + for(; i >= 0; i--) + case i { + 0 or 2 or 4 or 6 or 8 or 10 => + print("Even\n"); + continue loop; + * => + print("Odd\n"); + break loop; + } + + print("i's value: %d\n", i); + + c := 'c'; + + case c { + 'a' to 'f' => + print("Valid hex\n"); + 'C' => + print("The letter 'C'\n"); + * => + print("The default\n"); + } + + str := "ducks"; + + case str { + "ducks" => + print("Quack!\n"); + "" => + print("Nil string\n"); + } + + n := 1; + + case n { + 0 or 1 => + print("This is binary\n"); + * => + print("This is non-binary\n"); + } + + f := big 6; + + case f { + big 4 => print("The number 4\n"); + big 5 => print("The number 7\n"); + * => + print("Neither 4 nor 7\n"); + } + + exit; +} |
