Download code

From LiteratePrograms

Jump to: navigation, search

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 


Views
Personal tools