1implement Fibonacci; 2 3include "sys.m"; 4include "draw.m"; 5 6Fibonacci: module 7{ 8 init: fn(nil: ref Draw->Context, argv: list of string); 9}; 10 11init(nil: ref Draw->Context, nil: list of string) 12{ 13 sys := load Sys Sys->PATH; 14 for(i := 0; ; i++){ 15 f := fibonacci(i); 16 if(f < 0) 17 break; 18 sys->print("F(%d) = %d\n", i, f); 19 } 20} 21 22FIB: exception(int, int); 23HELP: con "help"; 24 25NOVAL: con -1000000000; 26 27fibonacci(n: int): int 28{ 29 { 30 fib(1, n, 1, 1); 31 } 32 exception e{ 33 FIB => 34 (x, nil) := e; 35 return x; 36 * => 37 return NOVAL; 38 } 39 return NOVAL; 40} 41 42fib(n: int, m: int, x: int, y: int) raises (FIB) 43{ 44 if(n >= m) 45 raise FIB(x, y); 46 47 { 48 fib(n+1, m, x, y); 49 } 50 exception e{ 51 FIB => 52 (x, y) = e; 53 x = x+y; 54 y = x-y; 55 raise FIB(x, y); 56 * => 57 raise HELP; 58 } 59} 60