From c818e95dc18d91228358fc9750d29dcd8cc9b488 Mon Sep 17 00:00:00 2001 From: henesy Date: Mon, 11 Mar 2019 23:22:22 -0500 Subject: add exceptions example and explanation --- Exceptions/README.md | 31 ++++++++++++++++++++++++++++--- Exceptions/exceptions.b | 46 ++++++++++++++++++++++++++++++++++++++++++++-- README.md | 1 + 3 files changed, 73 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); + } +} diff --git a/README.md b/README.md index 9a50133..67892dd 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ You could then run said file with: - [Functions](./Functions) - [Function References](./Function-Refs) - [Generics, Picks, and Interfaces (kind of)](./Generics) +- [Exceptions](./Exceptions) ## References -- cgit v1.2.3