Download code
From LiteratePrograms
Back to Fibonacci_numbers_(Hume)
Download for Windows: zip
Download for UNIX: zip, tar.gz, tar.bz2
fibo-c.hume
1 2 3 stream output to "std_out"; 4 5 type integer = int 32 ; 6 7 exception EUnbelievable :: (integer, string) ; 8 9 exception EIllegalArg :: string ; 10 11 12 13 14 fibo :: integer -> integer ; 15 16 fibo 0 = 0; 17 fibo 1 = 1; 18 fibo n = if n < 0 then raise EIllegalArg "fibo negative argument: " ++ (n as string) 19 else fibo(n-1) + fibo (n-2); 20 21 22 23 -- bounded regular recursive fibo 24 25 bfibo :: integer -> integer ; 26 27 bfibo n = (fibo n) within 10ms ; -- Constraint to 10 miliseconds, raises Timeout 28 29 30 31 box fib 32 in (n::integer) 33 out (nextn::integer, result::(integer, integer, string)) 34 handles Timeout, HeapOverflow, StackOverflow, EUnbelievable, EIllegalArg 35 within 400B (200B) -- heap_space ( stack_space) cost bounding 36 37 match 38 n -> if n >= 99 then raise EUnbelievable (n, "reached") 39 else (n+1, (n, bfibo n, "\n")) 40 41 handle 42 Timeout e -> ( 0, (*, *, "Caught timeout, resetting n to 0\n")) -- set nextn to 0, * means ignored output 43 | HeapOverflow e -> ( 0, (*, *, "Caught HeapOverflow, resetting n to 0\n")) 44 | StackOverflow e -> ( 0, (*, *, "Caught StackOverflow, resetting n to 0\n")) 45 | EUnbelievable (n, msg) -> (0, (n, *, "Unbelievable value reached, resetting n to 0\n")) -- string concat. not admitted here by compiler 46 | EIllegalArg msg -> (0, (*, *, msg)) 47 48 ; 49 50 51 52 53 wire fib 54 (fib.nextn initially 0) --inputs (get fib.n from fib.nextn) 55 (fib.n, output) ; --outputs (put fib.nextn to fib.n, result to output) 56 57
fibo-i.hume
1 2 3 stream output to "std_out"; 4 5 type integer = int 32 ; 6 7 exception EUnbelievable :: (integer, string) ; 8 9 exception EIllegalArg :: string ; 10 11 12 13 14 fibo2_tr :: integer -> integer -> integer -> integer ; 15 fibo2_tr 0 result next = result ; -- last recursion, take first item 16 fibo2_tr iter result next = fibo2_tr (iter-1) next (result+next); 17 18 fibo2 :: integer -> integer ; 19 fibo2 n = if n < 0 then raise EIllegalArg "fibo2 negative argument: " ++ (n as string) 20 else fibo2_tr n 0 1; 21 22 23 24 -- bounded tail recursive fibo 25 26 bfibo2 :: integer -> integer ; 27 28 bfibo2 n = (fibo2 n) within 10ms ; -- Constraint to 10 miliseconds, raises Timeout 29 30 31 32 box fib 33 in (n::integer) 34 out (nextn::integer, result::(integer, integer, string)) 35 handles Timeout, EUnbelievable, EIllegalArg 36 37 match 38 n -> if n >= 99 then raise EUnbelievable (n, "reached") 39 else (n+1, (n, bfibo2 n, "\n")) 40 41 handle 42 Timeout e -> ( 0, (*, *, "Caught timeout, resetting n to 0\n")) -- set nextn to 0, * means ignored output 43 | EUnbelievable (n, msg) -> (0, (*, *, "Unbelievable: " ++ (n as string) ++ msg ++ ", resetting n to 0\n")) 44 | EIllegalArg msg -> (0, (*, *, "IllegalArg: " ++ msg ++ "\n")) 45 ; 46 47 48 49 50 wire fib 51 (fib.nextn initially 0) --inputs (get fib.n from fib.nextn) 52 (fib.n, output) ; --outputs (put fib.nextn to fib.n, result to output) 53 54
