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 <mfl...@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 ____________________ Racket Users list: http://lists.racket-lang.org/users