[plt-scheme] Re: Unit/sig and hygiene

From: Dave Gurnell (d.j.gurnell at gmail.com)
Date: Tue Oct 3 05:55:37 EDT 2006

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
>



Posted on the users mailing list.