From 7635c9c15d25fce6b392f9899a68a36cdd7c06c4 Mon Sep 17 00:00:00 2001 From: henesy Date: Thu, 28 Feb 2019 12:48:48 -0600 Subject: add note about pete vnc ;; source, but no explanation for switch --- README.md | 2 ++ Switch/README.md | 46 ++++++++++++++++++++++++++++++++++++ Switch/switch.b | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 Switch/README.md create mode 100644 Switch/switch.b diff --git a/README.md b/README.md index 783fc51..cb6d7ea 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ Examples will, if they reference lines in source within an explanation, utilize Examples are composed in acme(1) which allows you to right click these strings to jump to the relevant source lines. +If you'd like to try Inferno without installing, I recommend trying Pete's on-demand VNC: http://tryinferno.reverso.be/ + The `;` rune indicates a command to be run from the Inferno sh(1) shell. ## Building 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; +} -- cgit v1.2.3