X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=example.spl;h=58d037e7ac1d00c647b19e0584c7a640f3698f71;hb=889d4798a0da64d76422da98378f5e5c35f0bf32;hp=f7ce562c5946cf2ba1169f81b50fd0274b1bfdee;hpb=98144e50ff2ca8e8d89dd1a39d4f2a41c2c6dab6;p=cc1516.git diff --git a/example.spl b/example.spl index f7ce562..58d037e 100644 --- a/example.spl +++ b/example.spl @@ -9,3 +9,87 @@ facR(n) :: Int -> Int { return n * facR(n-1); } } + +//The iterative version of the factorial function +facl ( n ) :: Int -> Int { + var r = 1; + while(n>1){ + r = r*n; + n = n-1; + } + return r; +} + +//A main function to check the results +//It takes no arguments, so the type looks like this: +main ( ) :: Void { + var n = 0; + var facN = 1; + var ok = True; + while(n<20) { + facN = facR (n); + if (facN != factl (n) || facn != facL (n)){ + print (n : facN : facl (n) : facL (n): []); + ok=False; + } + } + print(ok); +} + +// A list based factorial function +// Defined here to show that functions can be given in any order (unlike C) +facL (n) :: Int -> Int { + return product (fromTo(1, n) ); //Inline comments yay +} + +//Generates a list of integers from the first to the last argument +fromTo (from, to) :: Int Int -> [Int] { + if(from <= to){ + return from:fromTo(from+1, to); + } else { + return []; + } +} + +//Make a reversed copy of any list +reverse(list):: [t] -> [t] { + var accu = []; + while(!isEmpty(list)){ + accu = list.hd:accu; + list = list.tl; + } + return accu; +} + +//Absolute value, in a strange layout +abs(n)::Int->Int{if(n<0)return -n; else return n;} + +//swap the elements in a tuple +swap(tuple) :: (a, a) -> (a, a){ + var tmp = tuple.fst; + tuple.fst = tuple.snd; + tuple.snd = tmp; + return tuple; +} + +//list append +append(l1, l2) :: [t] [t] -> [t] { + if(isEmpty(l1)){ + return l2; + } else { + l1.tl = append(l1.tl, l2); + return l1; + } +} + +//square the odd numbers in a list and remove the even members +squareOddNumbers(list) :: [Int] -> [Int] { + while(!isEmpty (list) && list.hd % 2==0){ + list=list.tl; + } + if(!isEmpty(list)){ + list.hd = list.hd*list.hd; + list.tl = squareOddNumbers(list.tl); + } + return list; +}