The 'preserves-marks flag makes sense only in the context of the JIT's implementation.
At the Racket level, there's no way to write a function `f` so that (with-continuation-mark 'x 'my-value (begin (f) (continuation-mark-set-first #f 'x))) produces anything other than 'my-value. Even if `f` contains a `with-continuation-mark` form to set a mark with the key 'x, returning from `f` necessarily means leaving the dynamic extent of that form, so the mark will not be visible. It turns out that the JITted form of `with-continuation-mark` is not responsible for popping a mark stack as it returns. Instead, every non-tail position is wrapped with a kind of push and pop of the continuation-mark stack. Since `(f)` appears in a non-tail position within with `begin` form, the call with be wrapped. If `f` is known to not have a `with-continuation-mark` as a tail form, however, then the push and pop of the continuation-mark stack will not be necessary around the `(f)` call. The 'preserves-marks flag tells the JIT that it can make that assumption. (In retrospect, a better name would be 'has-no-wcm-in-tail-position.) At Sat, 6 Sep 2014 11:36:37 -0300, Gustavo Massaccesi wrote: > I agree that to get this output, using continuation marks is a bad > idea. It'd be much better to use a parameter (or set!ing a global > variable at a last resort). > > I'm trying to understand continuations marks. I'm reading some parts > of the Racket compiler, and internally the functions have some flags > that are not visible from the Racket code. > > One of the flags is 'preserves-marks. From > http://docs.racket-lang.org/raco/decompile.html > > > The preserves-marks? field is true if calling the function is expected to > leave continuation marks unchanged by the time it returns. > > So: Can a function change the continuation marks after it returns? > What does that exactly mean? Can I use that to complete the code in my > original e-mail? Is that a good idea for a real program? > > (The last question is easy: No. :) ) > > > I also read the answer from Matthias Felleisen. I'm not sure that I > understood it completely, but somehow it give me a new idea to solve > this. But I need to try it before I'm sure it works. > > > Gustavo > > On Fri, Sep 5, 2014 at 7:04 PM, John Clements <[email protected]> > wrote: > > > > On Sep 5, 2014, at 2:24 PM, Gustavo Massaccesi <[email protected]> wrote: > > > >> I'm trying to add a continuation mark inside a function, but I want > >> that the new mark to be visible after the functions returns. (Mostly > >> for curiosity, not an actual problem.) > >> > >> I want something like this: > >> > >> ;-- > >> #lang racket/base > >> > >> (define (display-cm-x) > >> (displayln > >> (continuation-mark-set->list > >> (current-continuation-marks) 'x))) > >> > >> (define (add-cm-x v) > >> '???) > >> > >> (define-syntax-rule (with-cm-x v body ...) > >> (with-continuation-mark 'x v > >> body ...)) > >> > >> (let () > >> (display-cm-x) ;==>() > >> (with-cm-x 7 > >> (display-cm-x)) ;==>(7) > >> (display-cm-x) ;==>() > >> (add-cm-x 7) > >> (display-cm-x) ;actual==>(), expected==>(7) > >> ) > >> ;-- > >> > >> The last line prints (), but I wish it prints (7). > > > > This is going to sound flip, but … it sounds like you don’t want > > continuation > marks. The whole point of continuation marks is that they’re associated with > continuations, and will disappear when those continuations are gone. > > > > The example you give isn’t quite enough to figure out exactly what you > > want; > it sounds like some combination of fluid-let and … something else. > > > > Maybe you can describe why it is that you want this behavior? > > > > John > > > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users

