On this page:
bound-identifier=?
free-identifier=?
free-transformer-identifier=?
free-template-identifier=?
free-label-identifier=?
check-duplicate-identifier
identifier-binding
identifier-transformer-binding
identifier-template-binding
identifier-label-binding

11.3 Syntax Object Bindings

(bound-identifier=? a-id b-id [phase-level])  boolean?
  a-id : syntax?
  b-id : syntax?
  phase-level : (or/c exact-integer? #f)
   = (syntax-local-phase-level)
Returns #t if the identifier a-id would bind b-id (or vice versa) if the identifiers were substituted in a suitable expression context at the phase level indicated by phase-level, #f otherwise. A #f value for phase-level corresponds to the label phase level.

Examples:

  > (define-syntax (check stx)
      (syntax-case stx ()
        [(_ x y)
         (if (bound-identifier=? #'x #'y)
             #'(let ([y 'wrong]) (let ([x 'binds]) y))
             #'(let ([y 'no-binds]) (let ([x 'wrong]) y)))]))
  > (check a a)

  'binds

  > (check a b)

  'no-binds

  > (define-syntax-rule (check-a x) (check a x))
  > (check-a a)

  'no-binds

(free-identifier=? a-id b-id [phase-level])  boolean?
  a-id : syntax?
  b-id : syntax?
  phase-level : (or/c exact-integer? #f)
   = (syntax-local-phase-level)
Returns #t if a-id and b-id access the same local binding, module binding, or top-level binding – perhaps via rename transformers – at the phase level indicated by phase-level. A #f value for phase-level corresponds to the label phase level.

“Same module binding” means that the identifiers refer to the same original definition site, and not necessarily to the same require or provide site. Due to renaming in require and provide, or due to a transformer binding to a rename transformer, the identifiers may return distinct results with syntax-e.

Examples:

  > (define-syntax (check stx)
      (syntax-case stx ()
        [(_ x)
         (if (free-identifier=? #'car #'x)
             #'(list 'same: x)
             #'(list 'different: x))]))
  > (check car)

  '(same: #<procedure:car>)

  > (check mcar)

  '(different: #<procedure:mcar>)

  > (let ([car list])
      (check car))

  '(different: #<procedure:list>)

  > (require (rename-in racket/base [car kar]))
  > (check kar)

  '(same: #<procedure:car>)

(free-transformer-identifier=? a-id b-id)  boolean?
  a-id : syntax?
  b-id : syntax?

(free-template-identifier=? a-id b-id)  boolean?
  a-id : syntax?
  b-id : syntax?

(free-label-identifier=? a-id b-id)  boolean?
  a-id : syntax?
  b-id : syntax?
Same as (free-identifier=? a-id b-id #f).

Compares each identifier in ids with every other identifier in the list with bound-identifier=?. If any comparison returns #t, one of the duplicate identifiers is returned (the first one in ids that is a duplicate), otherwise the result is #f.

(identifier-binding id-stx [phase-level])
  
(or/c 'lexical
      #f
      (listof module-path-index?
              symbol?
              module-path-index?
              symbol?
              (or/c 0 1)
              (or/c exact-integer? #f)
              (or/c exact-integer? #f)))
  id-stx : syntax?
  phase-level : (or/c exact-integer? #f)
   = (syntax-local-phase-level)
Returns one of three kinds of values, depending on the binding of id-stx at the phase level indicated by phase-level (where a #f value for phase-level corresponds to the label phase level):

If id-stx is bound to a rename-transformer, the result from identifier-binding is for the identifier in the transformer, so that identifier-binding is consistent with free-identifier=?.

(identifier-transformer-binding id-stx)
  
(or/c 'lexical
      #f
      (listof module-path-index?
              symbol?
              module-path-index?
              symbol?
              (or/c 0 1)
              (or/c exact-integer? #f)
              (or/c exact-integer? #f)))
  id-stx : syntax?

(identifier-template-binding id-stx)
  
(or/c 'lexical
      #f
      (listof module-path-index?
              symbol?
              module-path-index?
              symbol?
              (or/c 0 1)
              (or/c exact-integer? #f)
              (or/c exact-integer? #f)))
  id-stx : syntax?

(identifier-label-binding id-stx)
  
(or/c 'lexical
      #f
      (listof module-path-index?
              symbol?
              module-path-index?
              symbol?
              (or/c 0 1)
              (or/c exact-integer? #f)
              (or/c exact-integer? #f)))
  id-stx : syntax?
Same as (identifier-binding id-stx #f).