Thanks, Matthew. I fixed it by not expanding the module* form in the local-expand, i.e. I used (list #'module*) as the third argument to local-expand.
Cheers, Marco On Fri, Aug 22, 2014 at 4:38 PM, Matthew Flatt <[email protected]> wrote: > I think this may be a problem in macro expansion with submodules. > > The `#%module-begin` from `racket/base` adds a submodule declaration > for `configure-runtime` when it doesn't see an existing submodule > declaration for `configure-runtime` --- but it looks for an existing > declaration as an immediate one, before macro-expanding the module > body. > > In your code, the `mute` wrapper hides the declaration of > `configure-runtime`, so a conflicting one gets added. The tricky part > is that this happens the second time that the `test` submodule is > expanded: > > * The overall module's body is forced via `local-expand`. > > * As a part of that local expansion, the `test` submodule is expanded' > its expansion includes a declaration of a `configure-runtime` > submodule. > > * The overall module's expanded body is wrapped back in > `#%module-begin`, which will re-expand all of the content, including > the `test` submodule. > > * The `test` submodule this second time around has a `#%module-begin` > that is supposed to be bound to `#%plain-module-begin`, but it ends > up being captured[*] by `#%module-begin` from "bootstrap-lang.rkt", > so that the submodule's body is again local-expanded and again send > to `#%module-begin` from `racket/base` with a `mute` wrapper around > the `configure-runtime` sub-submodule. > > The [*] step seems wrong to me. I think this may be an example of a > problem deep in the macro expander, and solving that is my next > project. > > > Since the repair (assuming that I have correctly diagnosed the cause) > may be a while, do you have a workaround already? The macro name `mute` > suggests that you may want to suppress the printing of expression > results at the top-level of a module, and that might be as easy as > expanding `#%module-begin` to `#%plain-module-begin`. Or maybe > `syntax/wrap-modbeg` can help, or maybe the strategy used by > `syntax/wrap-modbeg` would work better for your macro. > > > At Thu, 21 Aug 2014 17:22:29 +0100, Marco Monteiro wrote: > > Hello! > > > > I'm using Racket 6.1 > > > > I'm trying to understand this error. I'm using submodules in a language I > > defined. The language file is here: > > > > http://pastebin.com/7RiHHRmi > > > > Notice the commented out line 28. > > > > I use that language in the following code > > > > http://pastebin.com/Qa6RD9wF > > > > raco expanding this last file fails with > > > > module: duplicate submodule definition > > at: configure-runtime > > in: module > > context...: > > > /usr/share/racket/pkgs/compiler-lib/compiler/commands/expand.rkt:29:11: > > loop > > /usr/share/racket/pkgs/compiler-lib/compiler/commands/expand.rkt: > > [running body] > > /usr/share/racket/collects/raco/raco.rkt: [running body] > > /usr/share/racket/collects/raco/main.rkt: [running body] > > > > If I uncomment line 28 it no longer fails. If I use (module ...) instead > of > > (module* ...) it no longer fails independently of line 28 being commented > > out or not. > > > > Trying to macro expand that in drracket gives me "Internal error: car: > > contract violation ." error. > > > > What is happending here? > > > > Thanks, > > Marco > > ____________________ > > Racket Users list: > > http://lists.racket-lang.org/users >
____________________ Racket Users list: http://lists.racket-lang.org/users

