3.3.2 Tail calls

Scheme is “properly tail recursive”, meaning that tail calls or
recursions from certain contexts do not consume stack space or other
resources and can therefore be used on arbitrarily large data or for
an arbitrarily long calculation. Consider for example,

foo prints numbers infinitely, starting from the given n.
It’s implemented by printing n then recursing to itself to print
n+1 and so on. This recursion is a tail call, it’s the
last thing done, and in Scheme such tail calls can be made without
limit.

Or consider a case where a value is returned, a version of the SRFI-1
last function (see SRFI-1 Selectors) returning the last
element of a list,

If the list has more than one element, my-last applies itself
to the cdr. This recursion is a tail call, there’s no code
after it, and the return value is the return value from that call. In
Scheme this can be used on an arbitrarily long list argument.

A proper tail call is only available from certain contexts, namely the
following special form positions,

and — last expression

begin — last expression

case — last expression in each clause

cond — last expression in each clause, and the call to a
=> procedure is a tail call