[comp.lang.scheme] Scheme Digest #293

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