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 <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