--
-- This is a test of nested recursive procedure
-- calls with no local variables and forward declarations.
--
@c+
module test19_1 -- forwards again
private
  integer i, result;

  proc factorial(val integer n; ref integer result)
	    proc times(val integer a, b; ref integer prod);

	    proc fact(val integer pre, n; ref integer res)
	    integer temp;
	    begin
		if n # 0 -> times(n, pre, temp); fact(temp, n - 1, res); 
		[] n = 0 -> res := pre;
		fi;
	    end;

	    proc times begin prod := a * b; end;

    begin  -- body of factorial
    fact(1,n, result);
  end;

begin -- module body
    write  "The first 5 factorials are (in descending order):";
    i := 5;	
    do i > 0 ->	
    	factorial(i, result);
        write "factorial(", i, ") = ", result;
	i := i - 1;
    od;
end.
