Thanks. That is what I eventually figured out I needed to do. Also the original problem was a bug in the Macro Stepper, pr12248, which only added to my confusion.
-Eric On Oct 8, 2011, at 12:18 PM, Marco Maggi wrote: > Eric Dobson wrote: > >> I am playing around with syntax marks and have a program >> whose output confuses me. >> >> #lang racket >> (require (for-syntax racket/syntax)) >> (define-for-syntax marker (make-syntax-introducer)) >> (define-syntax (mark stx) >> (syntax-case stx () >> ((_ arg ...) (marker #'(begin arg ...))))) >> >> (define foo 'a) >> (mark >> (define foo 'b) >> foo >> (mark foo)) >> foo >> (mark foo) >> (mark (mark foo)) >> >> This outputs 5 values depending on which foo a binding >> refers to. Racket outputs 'b 'b 'a 'a 'a. But when I use >> the macro stepper and look at the marks on the uses line >> up with the bindings they alternate 'b 'a 'a 'b 'a, which >> is what I was expecting, but the arrows line up with the >> output. Can someone explain why I am getting these >> results? > > No answers so... I know nothing of Racket's internals and > the macro stepper, but I guess the "problem" is: you are not > using the marks the way they are meant to be and Racket's > "same marks" predicate does not do what you expect. > > Does the following program do what you expect? > > #lang racket > (require (for-syntax racket/syntax)) > > (define (print x) > (display x) > (newline)) > > (define-for-syntax marker (make-syntax-introducer)) > > #;(define-syntax (mark stx) > (syntax-case stx () > ((_ arg ...) > (marker #'(begin arg ...))))) > > (define-syntax (mark stx) > (syntax-case stx () > ((_ arg ...) > (syntax-local-introduce > (marker > (syntax-local-introduce #'(begin arg ...))))))) > > (define foo 'a) > (mark > (define foo 'b) > (print foo) > (print (mark foo))) > (print foo) > (print (mark foo)) > (print (mark (mark foo))) > > When Racket defines a mark, it uses that mark value itself > as its antimark; this is different from what other expanders > do (for example: psyntax uses #f as universal antimark > capable of annihilating every mark). > > The STX syntax object handed to the MARK transformer is > marked by the expander pushing on its marks stack a mark W > specific for such transformer; SYNTAX-CASE duplicates STX's > marks stack into ARG, then pushes W on the marks stack of > ARG; when the transformer returns, the returned syntax > object is marked again by the expander with W. The MARKER > function marks its argument with the mark M. > > To do what you want to do: first you have to annihilate > the W added to ARG with the inner SYNTAX-LOCAL-INTRODUCE, > then you add M using MARKER, finally you add W with the > outer SYNTAX-LOCAL-INTRODUCE; this last W is annihilated by > the W added by the expander to the output syntax object. > > Summary of marks pushed into ARG: > > annihilated > | | > ... previous marks ... W W M W W > | | > annihilated > > and the final result is that ARG in the output form is > marked with: > > ... previous marks ... M > > HTH > -- > Marco Maggi > _________________________________________________ > For list-related administrative tasks: > http://lists.racket-lang.org/listinfo/users _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users