--
-- This is a test of nested recursive procedures with parameters
-- and local variables but no forward declarations.
--  
@c+
module test17_3 -- params and deep nesting
private
	integer a;
	proc factorial (val integer n; ref integer result)
		proc fachelp(val integer pre, n; ref integer result)
			proc times (val integer b,c; ref integer result)
				integer a, i;
				proc add (val integer a,b; ref integer result)
				begin result := a+b; end;
			begin
				i := 0;
				a := 0;
				do  i < b -> i := i+1;
							 add(a,c,a);
				od;
				result := a;
			end;
		integer temp;
		begin -- fachelp
			if n > 0 -> times(n, pre, temp); fachelp(temp, n - 1, result); 
			[] n <= 0 -> result := pre;
			fi;
		end;

	begin -- factorial
		fachelp(1,n, result);
	end;

begin -- main body
factorial(4, a);
write "factorial(4) = ", a, " (should be 24)";
end.
