summaryrefslogtreecommitdiff
path: root/Switch
diff options
context:
space:
mode:
Diffstat (limited to 'Switch')
-rw-r--r--Switch/README.md46
-rw-r--r--Switch/switch.b72
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;
+}