[racket-dev] Constructing an identifier to an unexported binding

From: Eric Dobson (eric.n.dobson at gmail.com)
Date: Thu May 23 01:57:46 EDT 2013

Some modules have macros which expand into identifiers that are not
exported, as they want to protect those bindings. TR currently has the
following code which allows it to generate an identifier which is
free-identifier=? to what would appear in the output of the macros.

define (make-template-identifier what where)
  (let ([name (module-path-index-resolve (module-path-index-join where #f))])
    (parameterize ([current-namespace (make-empty-namespace)])
      (namespace-attach-module (current-namespace) ''#%kernel)
      (parameterize ([current-module-declare-name name])
        (eval `(,#'module any '#%kernel
                 (#%provide ,what)
                 (define-values (,what) #f))))
      (namespace-require `(for-template ,name))
      (namespace-syntax-introduce (datum->syntax #f what)))))

This turns out to be a slightly slow part of the initialization of TR.
Does anyone know another way to get such an identifier?

Posted on the dev mailing list.