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.

Reply via email to