gls@THINK.COM (Guy Steele) (02/07/90)
But HOW can it be done? I think the problem is to determine in every application of a compound procedure if it is the last command which is evaluated in a procedure. Another point of view is that the problem is to construct a framework in which application does not require conditional treatment. This can be done. The idea is that a procedure call *never* adds anything to the stack; *all* calls, as such, are tail-recursive. However, not all *evaluations* are tail-recursive. A frame must be added to the stack whenever one is about to evaluate a function argument, or the predicate part of a conditional, or any form except the last in a block, or in general whenever one is about to evaluate a subform but must regain control again. For a more extensive treatment of this topic, see my paper "Procedure Call Implementations Considered Harmful" in the Proceedings of the 1977 ACM National Conference. Happy hacking! --Guy Steele