This is the mail archive of the
guile@sources.redhat.com
mailing list for the Guile project.
Re: continuation and multi-threading
- To: djurfeldt at nada dot kth dot se
- Subject: Re: continuation and multi-threading
- From: Keisuke Nishida <kxn30 at po dot cwru dot edu>
- Date: 01 Aug 2000 15:59:36 -0400
- Cc: guile at sourceware dot cygnus dot com
- References: <m3g0oqnjrp.fsf_-_@indy.STUDENT.CWRU.Edu><m3d7jxa9gv.fsf@indy.STUDENT.CWRU.Edu><p2tpunx85vu.fsf@bohne.zrz.tu-berlin.de><m33dksvk8i.fsf@indy.STUDENT.CWRU.Edu><200007311359.NAA00736@ruebe.zrz.tu-berlin.de> <AD4WUXvScB@khim.sch57.msk.ru><m3wvi2m0pw.fsf@indy.STUDENT.CWRU.Edu> <87punux90c.fsf@piracy.red-bean.com><m3ya2h1vk4.fsf@indy.STUDENT.CWRU.Edu> <873dkpwmw5.fsf@piracy.red-bean.com><m3vgxlo5db.fsf@indy.STUDENT.CWRU.Edu> <xy73dkohlvy.fsf@mdj.nada.kth.se>
Mikael Djurfeldt <mdj@mdj.nada.kth.se> writes:
> Continuations really are quite simple. In a way, what `call/cc' does
> is that it makes a procedure (called "continuation") out of the
> context of the call to `call/cc' so that you can invoke what is
> supposed to happen after the `call/cc' at any time later:
(snip)
> You can probably implement it simply by taking a copy of the stack,
> and that implementation is OK for Guile.
>
> But it's still important that you understand them (something which I
> expect you to do within a couple of hours).
Okay, I got it. So a call of a continuation never returns, right?
In that case, I can implement it this way:
1. When call-with-current-continuation is called, the VM copies
the current stack and registers, and creates a continuation object
with them.
2. The VM calls a closure with the continuation in the regular way.
3. If the closure finishes without calling the continuation,
nothing happens. It continues execution.
4. Whenever a continuation is called, the VM throws out the current
stack and recovers the stack and registers that the continuation has.
It arranges the return value, and then continues execution.
I think that's it. Since the VM clears the stack when a continuation
is called, stack overflow won't happen. Is that right?
If this works, I don't think I have to do anything special - just to
implement a few additional VM instructions. Why do I need to break
the stack into frame objects?
One concern I have is the C stacks that people talk about. My VM does
nothing with C functions. I'll look at what Guile does now.
Thanks,
Keisuke Nishida