threads & dynamic environment & continuations
shivers@xxxxxx
(12 May 2000 01:20 UTC)
|
Re: threads & dynamic environment & continuations
Marc Feeley
(12 May 2000 01:55 UTC)
|
Re: threads & dynamic environment & continuations
shivers@xxxxxx
(12 May 2000 18:14 UTC)
|
Re: threads & dynamic environment & continuations Marc Feeley (12 May 2000 18:38 UTC)
|
Re: threads & dynamic environment & continuations
shivers@xxxxxx
(12 May 2000 18:44 UTC)
|
Re: threads & dynamic environment & continuations
Matthias Felleisen
(12 May 2000 02:46 UTC)
|
Re: threads & dynamic environment & continuations
shivers@xxxxxx
(12 May 2000 02:58 UTC)
|
Re: threads & dynamic environment & continuations Marc Feeley 12 May 2000 18:38 UTC
> I don't think this gets you all the way home. For example, assume K > is a continuation -- something we made with CALL/CC. This won't work: > (k (thunk)) > That sort-of punts the current continuation and "installs" K as > the continuation for the THUNK call. But a simple implementation of > Scheme wouldn't even realise that K was a continuation until THUNK > had returned -- we wanted to punt the current stack eagerly, *before* > we leapt off to THUNK. See the problem? Yes, what you want are the procedures (continuation-capture receiver) (continuation-graft cont thunk) (continuation-return cont result) which are defined at the end of this message. They only rely on call-with-current-continuation. I'm hoping to write a short paper on this for the Scheme workshop. > But put into SRFI-18 some *generic* language saying that dynamic binding > facilities should be part of the continuation, hence threads pick up > a new dynamic env on a continuation throw. > > How do you like that? > -Olin Fair enough. Marc (define (continuation-capture receiver) ((call-with-current-continuation ; note important extra paren! (lambda (cont) (continuation-return cont (receiver cont)))))) (define (continuation-graft cont thunk) (cont thunk)) (define (continuation-return cont result) (continuation-graft (lambda () result))) ; a test (begin (write 1) ; written to stdout (continuation-capture (lambda (cont) (with-output-to-file "foo" (lambda () (write 2) ; written to the file "foo" (continuation-graft cont (lambda () (write 3))) ; written to stdout (write 4))))) ; never written (write 5)) ; written to stdout