/* Note that ulong is 32 bits, so fac(12) is the largest * supported value. This is why the input parameter * is a byte. The parameters are all unsigned. */ proc nonrec fac(byte n) ulong: byte i; ulong rslt; rslt := 1; for i from 2 upto n do rslt := rslt * i od; rslt corp proc nonrec main() void: byte i; for i from 0 upto 12 do writeln(i:2, "! = ", fac(i):9) od corp