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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/racket-users/ae64e2cf-c3fb-4acd-95c0-1239dd98a9f8n%40googlegroups.com.