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

From: Spencer florence (spencerflorence at gmail.com)
Date: Mon Mar 10 23:10:20 EDT 2014

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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20140310/ca8c8558/attachment-0001.html>

Posted on the users mailing list.