"Apparent identifier binding" just shows the result of the identifier-binding function. It is labeled "apparent" because macro expansion is a discovery process, and if the identifier is in an unexpanded part of the program, the macro expander might discover additional binding forms that change its meaning before getting to the identifier itself.

The binding an identifier refers to depends on the marks, but it also depends on the environment where the identifier first occurred.

Here's one example:

  (define-syntax-rule (m)
    x)

  (define-syntax (m2 stx)
    (syntax-case stx ()
      [(m2)
       (syntax-local-introduce #'x)]))

  (lambda (x)
    (m)
    (m2)
    x)

In the lambda body, the x's produced by m and m2 both have apparent identifier binding of "none", but the direct use of x has binding "lexical". The x produced by m has a mark from the expansion of m, but the one produced by m2 has no mark, because m2 cancels it out using syntax-local-introduce.

Here's another example:

  (define-syntax (m3 stx)
    (syntax-case stx ()
      [(m3)
       (with-syntax ([x1 #'x]
                     [x2 (let ([x 'whatever]) #'x)])
         #'(void x1 x2))]))

  (m3)

The first x produced by m3 has a binding of "none", but the second one has a binding of "lexical" due to the let binding *in the implementation of the macro*. If the expander gets to the second x reference, it will raise an "identifier used out of context" error; that error is usually caused by a macro like the one above using the same name as an implementation-level binding and in the generated syntax.

Ryan


On 01/15/2015 01:28 PM, Spencer Florence wrote:
Hey All,

I'm trying to understand why two identifiers I have don't reference the
same value. If I look at them in the macro stepper all of their
properties and marks are the same, with the exception of "Apparent
identifier binding". One has "lexical (all phases)" and the other
"none". What is "Apparent identifier binding" and how does it get
determined?

--spencer


____________________
   Racket Users list:
   http://lists.racket-lang.org/users


____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to