{
-- This is a test of nested recursive procedures with parameters
-- and local variables.
}
$c+
module test17_2 {params and deep nesting}
private
	integer a;
	tuple [procedure factorial (value integer n; reference integer result)] fac;
	procedure fac@factorial
		tuple 
		[procedure fachelp(value integer pre, n; reference integer result)] help;
		procedure help@fachelp
			tuple 
			[procedure times (value integer b,c; reference integer result)] multiply;
			procedure multiply@times
				integer a, i;
				tuple 
				[procedure add (value integer a,b; reference integer result)] adder;
				procedure adder@add 
				begin 
					result := a+b; 
				end;
			begin
				i := 0;
				a := 0;
				do  i < b -> i := i+1;
							 adder!add(a,c,a);
				od;
				result := a;
			end;
		integer temp;
		begin { fachelp}
			if n > 0 -> 
				multiply!times(n, pre, temp); 
				help!fachelp(temp, n - 1, result); 
			[] n <= 0 -> result := pre;
			fi;
		end;

	begin { factorial}
		help!fachelp(1,n, result);
	end;

begin 
fac!factorial(4, a);
write "factorial(4) = ", a, " (should be 24)";
end.
