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. >> > >> > >> > >> > >> > >> > >> > >> >