[1] We saw in section 5.1 how to implement such a process with a register machine that had no stack; the state of the process was stored in a fixed set of registers.
[2] This implementation of tail recursion in ev_sequence is one variety of a well-known optimization technique used by many compilers. In compiling a function that ends with a function call, one can replace the call by a jump to the called function's entry point. Building this strategy into the interpreter, as we have done in this section, provides the optimization uniformly throughout the language.
[3] We can define has_no_more_exps as follows:
function has_no_more_exps(seq) {
            return is_null(seq);
5.4.2 Sequence Evaluation and Tail Recursion