[racket] macro help redux

From: Ryan Culpepper (ryanc at ccs.neu.edu)
Date: Tue Jun 8 17:57:02 EDT 2010

Todd O'Bryan wrote:
> I feel like I'm getting there, but macros still do things that confuse me.
> According to the Macro Stepper, I've written a macro that expands to:
> (module fields racket
>   (#%module-begin
>    (require "tables.rkt")
>    (require "../date-utils.rkt")
>    (begin
>      (define-struct
>       date-field
>       (contract)
>       #:transparent)
>      (define (create-date-field
>               #:contract
>               (contract db-date?))
>        (make-date-field contract))
>      (provide/contract
>       (create-date-field
>        (-> #:contract any/c date-field?))))))
> At the next step of the expansion, I get the error:
> expand: unbound identifier in module
> db-date?
> The only problem is that "../date-utils.rkt" provides db-date? and if
> I put everything inside the #%module-begin into its own DrRacket
> definitions window, it runs without error. For some reason, db-date?
> isn't available when it's needed, but I can't figure out how to make
> it available.
> What am I doing wrong?

Is your macro defined in "tables.rkt"? If that's the case, it doesn't 
matter whether the module where it's *used* imports date-utils, but 
whether the module where the macro is *defined* imports date-utils. 
That's the idea of hygienic macros; they're lexically scoped.

You can use the macro stepper to check an identifier's binding by 
clicking on the identifier (here, the reference to 'db-date?'), then 
opening the "Syntax properties" pane using the Stepper window. It'll 
tell you what bindings, if any, the identifier refers to.

Did that help?


Posted on the users mailing list.