[racket] call/comp, eq? and call-with-continuation-prompt

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Tue Mar 11 08:47:01 EDT 2014

You'll see that '(1 . 2) prints two extra times in that case, because
the captured continuation includes the printout of the result of `(t)`.
As a result, the `eq?` compares (void) to (void), since each printout
produced (void).

At Mon, 10 Mar 2014 20:10:20 -0700 (PDT), "Spencer florence" wrote:
> Out of curiosity, why would removing the prompt tag change the behavior?
> 
> On Mon, Mar 10, 2014 at 10:50 PM, Matthew Flatt <mflatt at cs.utah.edu>
> wrote:
> 
> > I think this is a compiler bug, where the compiler is changing
> >    (let ([a (cons 1 2)])
> >      (call-with-composable-continuation (λ (k) (set! g k)) p)
> >      a)
> > to
> >    (begin
> >      (call-with-composable-continuation (λ (k) (set! g k)) p)
> >      (cons 1 2))
> > so you get a new pair each time the continuation is called.
> > I will need to fix the compiler so that it doesn't move allocation past
> > an expression that could capture a continuation.
> > At Mon, 10 Mar 2014 21:44:19 -0400, Spencer Florence wrote:
> >> For some reason the below program returns false:
> >> 
> >> #lang racket
> >> (define g #f)
> >> (define p (make-continuation-prompt-tag))
> >> (define (t)
> >>   (let ([a (cons 1 2)])
> >>     (call-with-composable-continuation (λ (k) (set! g k)) p)
> >>     a))
> >> (call-with-continuation-prompt t p)
> >> (eq? (call-with-continuation-prompt g p)
> >>        (call-with-continuation-prompt g p))
> >> 
> >> This happens with call/cc as well. From my understanding a should be
> >> allocated before the continuation is captured, so the two calls to g should
> >> return the same cell. If I remove the prompt tag the program returns true.
> >> 
> >> Anyone have any clue whats going on or how to fix?
> >> 
> >> --Spencer
> >> ____________________
> >>   Racket Users list:
> >>   http://lists.racket-lang.org/users____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users


Posted on the users mailing list.