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