summaryrefslogtreecommitdiff
path: root/Exceptions
diff options
context:
space:
mode:
Diffstat (limited to 'Exceptions')
-rw-r--r--Exceptions/README.md31
-rw-r--r--Exceptions/exceptions.b46
2 files changed, 72 insertions, 5 deletions
diff --git a/Exceptions/README.md b/Exceptions/README.md
index df654d3..9350a28 100644
--- a/Exceptions/README.md
+++ b/Exceptions/README.md
@@ -6,14 +6,39 @@ The example in this section is a derivative of the function reference summary in
## Source
-###
+### exceptions.b:17,26
+This section calculates numbers within the fibonacci sequence to a given interval. In this case, the first 5 numbers are calculated within the sequence.
+Note the call to the `raise` keyword after the fibonacci calculations have completed, but before the program exits.
-## Demo
+### exceptions.b:31,47
+
+The `fibonacci()` function attempts to perform a `fib()` call and, if an exception `e` is thrown, attempts to handle the exception in a manner depending on the exception type.
+
+Note that the attempted operation is wrapped in a `{ ... }` block.
+
+### exceptions.b:49,63
+The `raises` clause allows for warnings to be generated for un-caught exception potential within a program. Note that these exception types can be user-defined.
+
+The `FIB` exception type is defined at: exceptions.b:12
+
+## Demo
+ ; limbo exceptions.b
+ ; exceptions
+ F(0) = 1
+ F(1) = 1
+ F(2) = 2
+ F(3) = 3
+ F(4) = 5
+ sh: 798 "Exceptions":going down!
+ ;
## Exercises
--
+- Try removing the raise for "going down!".
+- Remove the `i < 5` portion of the for loop, how many values are printed and why?
+- Try removing the exception-catching block from around calls to `fib()`, do you get warnings?
+- Try changing the raise type within `fib()`, does `fibonacci()` handle the exception `e` differently?
diff --git a/Exceptions/exceptions.b b/Exceptions/exceptions.b
index 336c448..b9addaa 100644
--- a/Exceptions/exceptions.b
+++ b/Exceptions/exceptions.b
@@ -4,18 +4,60 @@ include "sys.m";
include "draw.m";
sys: Sys;
-print: import sys;
Exceptions: module {
init: fn(nil: ref Draw->Context, nil: list of string);
};
+FIB: exception(int, int);
+
init(nil: ref Draw->Context, nil: list of string) {
sys = load Sys Sys->PATH;
-
+ for(i := 0; i < 5 ; i++) {
+ f := fibonacci(i);
+
+ if(f < 0)
+ break;
+
+ sys->print("F(%d) = %d\n", i, f);
+ }
raise "going down!";
exit;
}
+
+fibonacci(n: int): int {
+ {
+ fib(1, n, 1, 1);
+ } exception e {
+ FIB =>
+ (x, nil) := e;
+ return x;
+
+ "*" =>
+ sys->print("unexpected string exception %s raised\n", e);
+
+ * =>
+ sys->print("unexpected exception raised\n");
+ }
+
+ return 0;
+}
+
+fib(n, m, x, y: int) raises (FIB) {
+ if(n >= m)
+ raise FIB(x, y);
+ {
+ fib(n+1, m, x, y);
+ } exception e {
+ FIB =>
+ (x, y) = e;
+
+ x = x+y;
+ y = x-y;
+
+ raise FIB(x, y);
+ }
+}