[racket] Behavior of continuation-mark-set->list and continuation-mark-set-first with respect to key values
Y. that's the solution. Thanks very much
I'm going to read a few more hours of ch. 16, as its obviously a
weakness on my part.
Also, jeez, what a great paper Flatt et al. is. I know I've said it to
you before. Won't be the last time, either.
On Sun, May 6, 2012 at 9:57 PM, Robby Findler wrote:
> Do you mean to just leave the quote off of the usage example?
>
> If not, you could do something like the below (note that this doesn't
> do a good job of error reporting and the test module requires a git
> version of racket to run).
>
> Robby
>
> #lang racket
>
> (define-syntax-rule
> (with-continuation-marks keys vals body)
> (with-continuation-marks/proc keys vals (λ () body)))
>
> (define (with-continuation-marks/proc keys vals thunk)
> (let loop ([keys keys]
> [vals vals])
> (cond
> [(null? keys)
> (thunk)]
> [else
> (with-continuation-mark (car keys) (car vals)
> (loop (cdr keys)
> (cdr vals)))])))
>
> (module+ test
> (require rackunit)
> (check-equal?
> (continuation-mark-set->list
> (with-continuation-marks '(id1 id2 id3)
> '(1 2 3)
> (current-continuation-marks))
> 'id1)
> '(1)))
>
>
> On Sun, May 6, 2012 at 8:10 PM, Galler <lzgaller at optonline.net> wrote:
>> Thanks Robby.
>>
>> I'm attempting to implement the behavior described in Section 3.2 of
>> your
>> 2007 paper, specifically
>>
>> "each continuation frame can have any number of marks with distinct
>> keys"
>>
>> by defining a new 'with-continuation-marks' syntax which will set up
>> arbitrary number of nested 'with-continuation-mark' calls in response
>> to a
>> list of keys
>>
>> As Eli B. picked up on earlier, I'm having trouble with Chapter 16 of
>> the
>> Racket Guide and its a mess at the moment.
>>
>>
>>
>> Is there a basic example of pattern matching for a list of arbitrary
>> number
>> of elements (including zero)? I
>>
>>
>> ; usage (with-continuation-marks '(id1 id2 id3) body)
>>
>> ;this doesn't work because of bad pattern matching in the
>> with-continuation-marks macro. (make-binding ...) just sets up
>> storage.
>> ;its the '(id1 id2 id3) in the arguments that's causing the problem.
>>
>>
>> (define-syntax with-continuation-marks
>> (syntax-rules ()
>> [(with-continuation-marks (id) body) (with-continuation-mark id
>> (make-binding id) body)]
>> [(with-continuation-marks (id1 id2 ...) body)
>> (with-continuation-mark id1
>> (make-binding id1) (with-continuation-marks (id2 ...) body ))]))
>>
>>
>>
>> On Sun, May 6, 2012 at 9:56 AM, Robby Findler wrote:
>>
>>> continuation-mark-set->list always does return all of the bindings,
>>> but continuation marks are carefully designed to avoid breaking tail
>>> recursion (they let you understand the tail behavior of your
>>> program,
>>> more accurately) so that's why you see only one binding.
>>>
>>> continuation-mark-set-first can be more efficient than
>>> continuation-mark-set->list and it is more likely to work in
>>> futures.
>>> That's the only reason it exists.
>>>
>>> Robby
>>>
>>> On Sat, May 5, 2012 at 11:02 PM, Galler <lzgaller at optonline.net>
>>> wrote:
>>>>
>>>> BACKGROUND:
>>>>
>>>> Per the documentation:
>>>>
>>>> with-continuation-mark causes a key to be associated with a
>>>> binding
>>>> within
>>>> a continuation frame
>>>>
>>>> continuation-mark-set->list returns the binding(s) associated with
>>>> that
>>>> particular key, for any given continuation-mark-set
>>>>
>>>> while
>>>>
>>>> continuation-mark-set-first returns the first (innermost) binding
>>>> associated
>>>> with a particular key
>>>>
>>>> QUESTIONABLE BEHAVIOR
>>>>
>>>> The issue is:
>>>>
>>>> if a key is reused, the only binding continuation-mark-set->list
>>>> returns
>>>> is
>>>> the innermost binding.
>>>>
>>>> So continuation-mark-set->list could only possibly return **one**
>>>> value
>>>>
>>>> and
>>>>
>>>> continuation-mark-set-first appears redundant
>>>>
>>>> Is that the desired behavior? I would have expected
>>>> continuation-mark-set->list to return all the bindings for a
>>>> particular
>>>> key.
>>>>
>>>> Additionally, I suspect continuation-mark-set->context has to be
>>>> implemented
>>>> using the 'return a list of all bindings for a single key'
>>>> behavior,
>>>> since
>>>> the documentation indicates it uses a single private key.
>>>>
>>>>
>>>> EXAMPLE
>>>>
>>>> #lang racket
>>>> (with-continuation-mark 'global 'outermost-value
>>>> (let/cc k-outer
>>>> (with-continuation-mark 'global 'middle-value
>>>> (let/cc k-inner
>>>> (with-continuation-mark 'global 'inner-value (begin
>>>> (display
>>>> (continuation-mark-set->list (current-continuation-marks) 'global))
>>>> (newline)
>>>> (display
>>>> (continuation-mark-set->list (continuation-marks k-inner) 'global))
>>>> (newline)
>>>> (display
>>>> (continuation-mark-set->list (continuation-marks k-outer) 'global))
>>>> ))))))
>>>>
>>>> ;Returns
>>>>
>>>> ;(inner-value)
>>>>
>>>> ;(middle-value)
>>>>
>>>> ;(outermost-value)
>>>>
>>>> but I would have expected:
>>>>
>>>> ;Returns
>>>>
>>>> ;(inner-value) (middle-value) (outermost-value)
>>>>
>>>> ;(middle-value) (outermost-value)
>>>>
>>>> ;(outermost-value)
>>>>
>>>>
>>>> Thanks very much for looking at this.
>>>>
>>>> R/
>>>>
>>>> Zack
>>>> ____________________
>>>> Racket Users list:
>>>> http://lists.racket-lang.org/users