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