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;
+}
lex ['B':'o':'o':'l':rest] = (Right BoolTypeToken, rest)
//Two character tokens
lex [':':':':rest] = (Right DoubleColonToken, rest)
+lex ['!':'=':rest] = (Right NotEqualToken, rest)
lex ['<':'=':rest] = (Right LesserEqToken, rest)
lex ['>':'=':rest] = (Right GreaterEqToken, rest)
lex ['=':'=':rest] = (Right EqualsToken, rest)
print i [VarToken:rest] = ["var ":print i rest]
print i [ReturnToken:rest] = ["return ":print i rest]
print i [IfToken:rest] = ["if":print i rest]
-print i [ElseToken:rest] = ["else":print i rest]
+print i [ElseToken:rest] = ["else ":print i rest]
print i [WhileToken:rest] = ["while":print i rest]
print i [TrueToken:rest] = ["True":print i rest]
print i [FalseToken:rest] = ["False":print i rest]
print i [CharTypeToken:rest] = ["Char":print i rest]
print i [BoolTypeToken:rest] = ["Bool":print i rest]
print i [DoubleColonToken:rest] = [" :: ":print i rest]
+print i [NotEqualToken:rest] = [" != ":print i rest]
print i [LesserEqToken:rest] = [" <= ":print i rest]
print i [GreaterEqToken:rest] = [" >= ":print i rest]
print i [EqualsToken:rest] = [" == ":print i rest]