[racket] Delimited continuations and parameters

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Mon May 14 22:26:50 EDT 2012

Oh, wait. Sorry. I got mixed up.

Robby

On Mon, May 14, 2012 at 9:26 PM, Robby Findler
<robby at 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 <mflatt at 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


Posted on the users mailing list.