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)))))) ____________________ Racket Users list: http://lists.racket-lang.org/users