let
   var z := 5  
   var u := "I love compiling!\n"

   function f(x:int, y:int) : int = x+y-1

   function factorial(n:int) : int = 
       if n<2 then n else n*factorial(n-1)

   function tailfact(n:int, m:int) : int =
      if n<2 then m 
         else tailfact(n-1,m*n)

   function ifact(n:int) : int =
     let var ax := 1
         var ln := n    % locals can't be changed in bobcat 
       in

	while ln>1
         do
	  ( ax := ax*ln;
            ln := ln-1
          );

        ax
       end   % ifact

   in

   while z>1 
    do (
          z := z-1; 
          printf("n = %d\n",z)
       );

   z := f(4,z+2);
   printf("z is finally %d\n",z);

   if z>10 then printf("z is big\n") 
      else if z>2 then printf("z is small\n")
              else printf("z is tiny\n");

   z := factorial(6);
   printf("the factorial of 6 is %d\n",z);
   printf("with tail recursion it's also %d\n",tailfact(6,1));
   printf("without recursion it's still %d\n",ifact(6));
   printf(u)

   end
$
  
