Racket v8.6 behaves the same way.

On Fri, Nov 18, 2022 at 9:29 AM Shiro Kawai <shiro.ka...@gmail.com> wrote:

> I used Racket v7.2, and here's the full transcription.  I'm going to check
> with the newest Racket.
>
> shiro@scherzo:~/src/srfi-226$ racket
> Welcome to Racket v7.2.
> > (require racket/control)
> > (define (print . xs) (for-each display xs) (newline))
> > (define m (make-parameter 0))
> > (define c #f)
> > (define (foo)
>     (parameterize ((m 1))
>       (reset
>        (print 'a: (m))
>        (shift k (print 'b: (m)) (set! c k))
>        (print 'c: (m)))))
> > (define (bar)
>     (parameterize ((m 2))
>       (c #f)))
> > (foo)
> a:1
> b:1
> > (bar)
> c:2
>
>
> On Fri, Nov 18, 2022 at 9:26 AM Marc Nieper-Wißkirchen <
> marc.nie...@gmail.com> wrote:
>
>> Thanks for the report, Shiro!
>>
>> I have to investigate Racket's behavior.  In 11.3.2 of the Racket
>> reference, it says: "If a continuation is captured during the
>> evaluation of parameterize, invoking the continuation effectively
>> re-introduces the parameterization, since a parameterization is
>> associated to a continuation via a continuation mark (see Continuation
>> Marks) using a private key."  This seems to be consistent with SRFI
>> 226 and its sample implementation, but not consistent with your Racket
>> experiments.
>>
>> Am Fr., 18. Nov. 2022 um 20:07 Uhr schrieb Shiro Kawai <
>> shiro.ka...@gmail.com>:
>> >
>> > It seems that there's a disagreement in how a delimited continuation
>> captures dynamic environment, between Racket and srfi-226.
>> >
>> > Suppose the following code:
>> >
>> > ```
>> > (define (print . xs) (for-each display xs) (newline))
>> >
>> > (define m (make-parameter 0))
>> >
>> > (define c #f)
>> >
>> > (define (foo)
>> >   (parameterize ((m 1))
>> >     (reset
>> >      (print 'a: (m))
>> >      (shift k (print 'b: (m)) (set! c k))
>> >      (print 'c: (m)))))
>> >
>> > (define (bar)
>> >   (parameterize ((m 2))
>> >     (c #f)))
>> > ```
>> >
>> > With srfi-226 (using reset/shift as given in the srfi) reference
>> implementation on Chez, I get this:
>> >
>> > ```
>> > > (run foo)
>> > a:1
>> > b:1
>> > > (run bar)
>> > c:1
>> > ```
>> >
>> > With Racket racket/control, I get this:
>> >
>> > ```
>> > > (foo)
>> > a:1
>> > b:1
>> > > (bar)
>> > c:2
>> > ```
>> >
>> > I'm switching Gauche's internals to srfi-226 based model, and I noticed
>> the difference---the current released version of Gauche (relying on
>> dynamic-wind to handle parameterization) works like Racket, while the
>> srfi-226 based version (using dynamic env chain to keep parameters) works
>> like srfi-226 reference implementation.
>> >
>> > I think srfi-226 behavior is more consistent (when the delimited
>> continuation is invoked, it restores the dynamic environment of the
>> continuation of reset), but is there a plausible explanation of Racket
>> behavior?
>> >
>> > This difference actually caused a compatibility problem of an existing
>> application so I want to understand it fully.
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>>
>

Reply via email to