Scheme is a counterexample, it supports both mandatory tail calls & continuations.
I've no idea how stuff is implemented in Parrot, but an obvious idea would be to have some kind of lazy copying scheme (i.e. maintain a reference count for the stack frames & copy the respective one before mutating it in a tail call, if necessary). Cheers, Michael On Wed, 10 Nov 2004 10:40:45 -0800, Jeff Clites <[EMAIL PROTECTED]> wrote: > I was thinking: Implementing tail calls seems easy; the normal calling > sequence of "do some setup, then jump" just turns into "don't bother > with (most of) the setup, just jump". That is, don't move a new > register base-pointer into place, etc. > > But there's one wiggle: If you've created a continuation previously > (and it still exists), then any call has to preserve the frame--you > basically can't do a tail call, with its key implication of the > "current frame" vaporizing, or being re-used (depending on how you want > to describe it). > > But that's not too much of a problem, with the following: > > 1) Consider a tailcall op a recommendation--but have the VM do a > regular call, if necessary. > 2) Regular calls create continuations, so you can't do a tail call out > of a function, if you've already done a regular call inside that > function, _unless_ we have an (efficient) way to tell if any such > continuation was "saved". You can figure some of that out at > compile-time (whether a regular call could have been already made), but > you'd need runtime checks for other cases, unless you just forego a > tail call any time you _could_ have already done a regular call (which > avoids the runtime checks, but allows less actual tail calls). > > Do any existing languages have both tail calls and continuations? > Scheme mandates that anything which looks like a tail call, must be > optimized as expected (other languages like Lisp merely permit it), but > I don't know of Scheme having continuations. Scheme cares, of course, > so that you can have ostensibly unlimited recursion, without running > out of stack space (or really, memory). Tail calls and continuations > seem a bit like opposites--one preserves state, the other destroys it. > > Just thought I'd send out these thoughts, since the topic was mentioned > recently. > > JEff > >