[racket] Lifting submodules
> I've been trying to answer it, but having one of those humbling
> experiences where I wonder how much I've really learned about macros,
> after all. I distilled it to just:
>
> #lang racket
> (define-syntax (define-modularize stx)
> (syntax-case stx ()
> ([_ thing-name mod-name]
> #'(begin
> (module mod-name racket
> (define thing-name #t)
> (provide thing-name))
> (require 'mod-name)))))
>
> (define-modularize foo foo-mod)
> ;; (require 'foo-mod)
> foo ;; => foo: unbound identifier in module
I've struggled with this before as well.
For this example, if I understand the docs correctly, the scope of the
require-spec has to match the scope of the use.
http://docs.racket-lang.org/reference/syntax-model.html?#(part._macro-introduced-bindings)
"In require for other require-specs, the generator of the require-spec
determines the scope of the bindings"
So the code below would work. Is there a better way?
#lang racket
(define-syntax (define-modularize stx)
(syntax-case stx ()
([_ thing-name mod-name]
(with-syntax ([require-spec (datum->syntax stx `(quote
,(syntax->datum #'mod-name)))])
#'(begin
(module mod-name racket
(define thing-name #t)
(provide thing-name))
(require require-spec))))))
(define-modularize foo foo-mod)
;; (require 'foo-mod)
foo ;; => foo: unbound identifier in module
>
> Only if the previous line with the require is uncommented, does it
> work. IOW the module and thing define/provide seem just fine, it's the
> require that is not working. Why?
>
> I've thought about it, used the stepper in DrRacket, tried everything
> I can think of -- but can't get it to work.
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users