Oh, wait. Sorry. I got mixed up. Robby
On Mon, May 14, 2012 at 9:26 PM, Robby Findler <ro...@eecs.northwestern.edu> wrote: > Also, just in case it wasn't obvious all along, here's another one: > > #lang racket > > (require racket/control) > > (define p (make-parameter 0)) > (define r (make-parameter 0)) > > ((λ (f) > (parameterize ([p 2]) > (values > (parameterize ([r 20]) > (f 0))))) > (parameterize ([p 1]) > (reset > (parameterize ([r 10]) > ((λ (x) (+ (p) (r))) > (shift f f)))))) > > On Mon, May 14, 2012 at 9:21 PM, Matthew Flatt <mfl...@cs.utah.edu> wrote: >> 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 ____________________ Racket Users list: http://lists.racket-lang.org/users