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