I'm using dynamic binding while also using delimited control operators such as shift and reset. When shift captures the context of a `parameterize`, I'd like to be able to resume that continuation in the same context multiple times without observing modifications caused by other resumptions.
I was surprised that subsequent re-entries can observe modifications from the earlier ones, since my mental model of dynamic parameters was that their values were retrieved from a fresh dynamic calling context, whose frames are copied each time the delimited continuation is invoked. But it looks like dynamic parameters actually rely on a shared mutable cell, in this case a thread cell. Knowing this, I have a strange workaround using a wrapping thread to force a distinct thread cell to be created for each resumption, providing isolation. Is there a better way to do this? I'm also interested in the reasons behind the current design. Is there a downside to storing parameter bindings directly on the stack, rather than in a thread cell pointed to by the stack? Here is an example, including a demonstration of the workaround: ``` #lang racket/base (require racket/control) (define P (make-parameter #f)) (define (show) (displayln (P))) (define (inc) (P (+ 1 (P)))) (define (re-enter k) (define result (void)) (define t (thread (lambda () (set! result (k (void)))))) (thread-wait t) result) (define K (reset (parameterize ((P 0)) (show) (inc) (shift k k) (show) (inc) (P)))) ;; The behavior that surprised me: (displayln "without threads:") (K) ; 2 (K) ; 3 (K) ; 4 ;; The behavior I would like: (displayln "with threads:") (re-enter K) ; 5 (re-enter K) ; 5 (re-enter K) ; 5 ``` Program output: 0 without threads: 1 2 2 3 3 4 with threads: 4 5 4 5 4 5 -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/ae64e2cf-c3fb-4acd-95c0-1239dd98a9f8n%40googlegroups.com.