[racket] Macros that use local-require (hygiene issues?)

From: Jay McCarthy (jay.mccarthy at gmail.com)
Date: Thu Nov 6 18:18:56 EST 2014

The begin works because the macro use is at the top-level and the
thing gets pulled up and spliced in, I believe.

The [a a] works because the second a is detected as a binder so it
gets matched up mark-wise with the second one rather than having them
erased? Hygiene? Marks? Dye packets?

Jay

On Thu, Nov 6, 2014 at 4:36 PM, Spencer Florence <spencer at 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 <alexander at 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 <spencer at 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
>



-- 
Jay McCarthy
http://jeapostrophe.github.io

           "Wherefore, be not weary in well-doing,
      for ye are laying the foundation of a great work.
And out of small things proceedeth that which is great."
                          - D&C 64:33


Posted on the users mailing list.