I just tried replacing the lexical context of path, and got this:

#lang racket/load
;;provider
(module T racket
  (provide a)
  (define a 1))
;; requirer
(module R racket
  (require (for-syntax syntax/parse syntax/strip-context))
  (define-syntax (test-binding stx)
    (syntax-parse stx
      [(_ path)
       #:with new-path (replace-context #'here #'path)
       #'(let () (local-require (only-in new-path a)) a)]))
  (test-binding 'T))
;; go
(require 'R)

So I think when it expands (only-in path [a a]), it introduces a with the 
lexical context of the second a,
bit when it expands (only-in path a), it introduces a with the lexical context 
of path.  

On Nov 6, 2014, at 4:36 PM, Spencer Florence <spen...@florence.io> wrote:

> Thanks! That fixed it!
> 
> Although I'm still curious as to why the error happens in the first place.
> On Thu Nov 06 2014 at 3:32:02 PM Alexander D. Knauth <alexan...@knauth.org> 
> wrote:
> I think I had a similar sort of problem about a year ago (I was at either 
> RacketCon or a Hackathon that same weekend and Mathew Flatt figured it out), 
> and the solution was changing (only-in path a) to (only-in path [a a]).
> 
> #lang racket/load
> ;;provider
> (module T racket
>   (provide a)
>   (define a 1))
> ;; requirer
> (module R racket
>   (require (for-syntax syntax/parse))
>   (define-syntax (test-binding stx)
>     (syntax-parse stx
>       [(_ path)
>        #'(let () (local-require (only-in path [a a])) a)]))
>   (test-binding 'T))
> ;; go
> (require ‘R)
> 
> 
> On Nov 6, 2014, at 4:09 PM, Spencer Florence <spen...@florence.io> wrote:
> 
> > Hi All,
> >
> > I've been struggling to have a macro be given a path then require something 
> > from that path. The following code produces and "Unbound Identifier" error, 
> > although I would expect it to evaluate to 1. Could someone provide insight 
> > into what is going on?
> >
> > #lang racket/load
> > ;;provider
> > (module T racket
> >   (provide a)
> >   (define a 1))
> > ;; requirer
> > (module R racket
> >   (require (for-syntax syntax/parse))
> >   (define-syntax (test-binding stx)
> >     (syntax-parse stx
> >       [(_ path)
> >        #'(let () (local-require (only-in path a)) a)]))
> >   (test-binding 'T))
> > ;; go
> > (require 'R)
> >
> >
> > P.S. I attempted to do this with `dynamic-require,` but that failed because 
> > in my actual program `path` is sometimes `(submod "..")`, which caused an 
> > error about not having a base path.
> >
> > ____________________
> >  Racket Users list:
> >  http://lists.racket-lang.org/users
> 

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

Reply via email to