[plt-scheme] Unit/sig and hygiene
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