There is a special kind of tail call known as a loop, in which the jump is made to the procedure containing the jump, or one or its parents.
Provided no pointers are kept to any of the frames of the procedures between the target and current frame, so that all these frames would be garbage collected, a jump to a parent can reuse the parent's storage.
This is a form of goto, except that the procedure arguments are re-initialised.
Loops are automatically detected in some cases by the compiler. An explicit loop statement may also be used:
1: include "std"; 2: 3: proc f(x:int) 4: { 5: if x == 0 goto zero; 6: print x; endl; loop f(x-1); 7: zero:> 8: print "Zero"; jump endl; 9: } 10: 11: f(10); 12: