[plt-scheme] Re: Unit/sig and hygiene
Does anyone have any advice regarding this post? It's still a mystery
to me.
Cheers,
-- Dave
> Hi all,
>
> We have a problem with the interaction between signed units and
> hygiene. Our problem is this:
>
> Module A defines syntax that expands into:
>
> - define-values/invoke-unit/sig
> - some macros that refer to bindings introduced by define-values/
> invoke-unit/sig
>
> A small fragment is below. The with-database macro expands to a
> call to call-with-database, which is defined in the snooze^ signature.
>
> (define-syntax (define-snooze-interface stx)
> (syntax-case stx ()
> [(define-snooze-interface db@)
> (syntax-local-introduce
> #'(begin
>
> ; The main snooze^ interface:
> (define-values/invoke-unit/sig snooze^
> (compound-unit/sig
> (import)
> (link (db : db^ (db@))
> (snooze : snooze^ (snooze@ db)))
> (export (open snooze))))
>
> ;; syntax (with-database (config) expr ...)
> ;;
> ;; Convenience form for call-with-database.
> (define-syntax (with-database stx)
> (syntax-case stx ()
> [(_ (config) expr (... ...))
> #'(call-with-database config (lambda () expr
> (... ...)))]))
>
> ; etc ...
>
> ))]))
>
> Module B calls define-snooze-interface:
>
> (module b mzscheme
> (require a)
> (provide (all-defined))
> (define-snooze-interface a-db))
>
> Module C requires B and attempts to use with-database. We receive
> an error
>
> reference to undefined identifier: call-with-database
>
> The problem, we think, is that define-values/invoke-unit/sig
> unhygienically introduces bindings, so these bindings are not
> apparent at the definition time of the with-database macro, so the
> call-with-database name does not refer to the binding introduced by
> the define-values/invoke-unit/sig form.
>
> So we think we know the problem, but we don't know how to solve
> it. All help appreciated!
>
> Thanks,
>
> Dave & Noel
>