[racket] Delimited continuations and parameters
At Mon, 14 May 2012 21:50:01 -0400, Asumu Takikawa wrote:
> On 2012-05-14 19:00:49 -0600, Matthew Flatt wrote:
> > In other words, every `parameterize' uses the same continuation mark,
> > so that `(parameterize ([r 10]) ...)' associates the parameterization
> > continuation mark with a single record that maps `r' to 10, `p' to 1,
> > etc. The entire record is carried by the delimited continuation.
>
> Thanks Matthew and Ryan, that clears it up. OTOH, it does look like a
> straightforward translation to continuation marks (or using
> unstable/markparam as Ryan pointed out) doesn't get the 12 result
> either.
>
> For example:
>
> #lang racket
>
> (require racket/control
> unstable/markparam)
>
> (define p (mark-parameter))
> (define r (mark-parameter))
>
> ((λ (f)
> (mark-parameterize ([p 2])
> (mark-parameterize ([r 20])
> (f 0))))
> (mark-parameterize ([p 1])
> (reset
> (mark-parameterize ([r 10])
> ((λ (x) (+ (mark-parameter-first p)
> (mark-parameter-first r)))
> (shift f f))))))
>
> Will produce an error
> +: expects type <number> as 1st argument, given: #f; other arguments were: 10
>
> > In the ICFP'07 paper on delimited continuations in Racket, we wrote (at
> > the end of section 5) that we'd probably change `parameterize', but
> > we've never gotten around to that change. Meanwhile, raw continuation
> > marks (as modeled directly in that paper) essentially match the
> > dynamic-binding form of Kiselyov et al.
>
> The raw continuation mark version gives essentially the same error as
> above, maybe because call/cc and call/comp restore the marks to what was
> present at capture time, which doesn't include the `p` mark?
It's because `unstable/markparam' lookup is delimited by the default
continuation prompt --- and I suppose that's a twist relative to
Kiselyov et al. and another facet of `control'+`prompt' versus
`shift'+`reset'. Below are two variants that produce 12.
----------------------------------------
#lang racket
(require racket/control)
(define (get-mark key)
(continuation-mark-set-first #f
key
#f
mark-prompt))
(define mark-prompt (make-continuation-prompt-tag))
(call-with-continuation-prompt
(lambda ()
((λ (f)
(with-continuation-mark 'p 2
(with-continuation-mark 'r 20
(f 0))))
(with-continuation-mark 'p 1
(reset
(with-continuation-mark 'r 10
((λ (x) (+ (get-mark 'p)
(get-mark 'r)))
(shift f f)))))))
mark-prompt)
----------------------------------------
#lang racket
(require racket/control)
(define (get-mark key)
(continuation-mark-set-first #f
key))
((λ (f)
(with-continuation-mark 'p 2
(with-continuation-mark 'r 20
(f 0))))
(with-continuation-mark 'p 1
(prompt
(with-continuation-mark 'r 10
((λ (x) (+ (get-mark 'p)
(get-mark 'r)))
(control f f))))))