[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
tail recursion optimization
- To: Kent M Pitman <KMP@SCRC-STONY-BROOK.ARPA>
- Subject: tail recursion optimization
- From: Rob MacLachlan <RAM@C.CS.CMU.EDU>
- Date: Tue, 03 Jun 1986 07:02:00 -0000
- Cc: Common-Lisp@SU-AI.ARPA
- In-reply-to: Msg of 3 Jun 1986 02:27-EDT from Kent M Pitman <KMP at SCRC-STONY-BROOK.ARPA>
I am not convinced the manual is unambiguous. This another one of
the cases where your lisp culture influences your interpretation. On
a lisp machine, doing a function call always means indirecting through
the definition cell, so it is obvious to you that a self call will
indirect through the definition cell. People who are used to using
tail-recursion instead of loops will think that it is just as obvious
that a tail-recursive self call turns into a branch.
Spice Lisp, and probably other implementations, do this particular
optimization, so the manual certainly wasn't sufficiently overt about
disallowing it. We definitely need a clarification one way or the
other, and it makes a great deal of sense to me to optimize the 99.99%
case instead of the perverse one. You do need a way to inhibit this,
but as I already said, that can be done with NOTINLINE.
If this were a beauty contest then you would surely win, since Common
Lisp doesn't currently have any way to talk about this sort
of compile-time binding of global names. I think that this
deficiency should be remedied by adding a notion of block
compilation. On conventional architectures, there are huge advantages
to resolving a function reference at compile time. To me, a defun is
just a degenerate block which contains only one definition and one
entry point.
Rob