//
// K&R, 2nd edition, page 24
//

//
// Translated into ATS by Hongwei Xi (hwxi AT cs DOT bu DOT edu)
//

(* ****** ****** *)

(*

#include <stdio.h>

extern int power (int base, int n) ;

int main () {
  int i ;
  for (i = 0; i < 10; ++i) {
    printf ("%d %d %d\n", i, power(2, i), power(-3, i)) ;
  }
  return 0 ;
} /* end of [main] */

/* ****** ****** */

int power (int base, int n) {
  int i, p ;
  p = 1 ;
  for (i = 1; i <= n; ++i) p = p * base ;
  return p ;
}

*)

extern fun power (base: int, n: int): int

implement
power (base, n) = loop (1, 1) where {
  // note that [loop] is a closure
  fun loop (i: int, p: int):<cloref1> int =
    if i <= n then loop (i+1, p * base) else p
} // end of [power]

(* ****** ****** *)

implement main () = let
  var i: int // uninitialized
in
  for (i := 0; i < 10; i := i + 1)
    printf ("%d %d %d\n", @(i, power(2, i), power(~3, i)))
end // end of [main]

(* ****** ****** *)

(* end of [power.c] *)