A portable implementation Andre van Tonder 06 Dec 2005 18:11 UTC

I have completed a portable implementation of SRFI-83.  This
implementation is fully integrated with my portable SRFI-72 macro
expander.

It can be found at:

  http://www.het.brown.edu/people/andre/macros/index.htm

and will be updated, time permitting, as SRFI-83 evolves.

The semantics is as in SRFI-83, but has been extended to
allow import into higher phases (as is need when let-syntax
is nested).

Example:

  (library "m" "scheme://r6rs"
    (export z)
    (define z 1))

  (import (for "m" run expand 2))  ; also (import (for "m" 0 1 2 ...))

  (let-syntax ((foo (lambda (form)
                      (let-syntax ((bar (lambda (form)
                                          (quasisyntax
                                           (quasisyntax (list z ,z ,,z))))))
                        (bar)))))
    (foo))
               ;==> (1 1 1)

The import syntax is:

  (for <import-set> <import-phase>*)

where

  <import-phase> ::= run | expand | all | 0 | 1 | 2 | ...

Here 0 == run, 1 == expand, and |all| wil cause import into
all phases, which is implicitly done with the <language>.
See the link for many commented examples of use.

The semantics is as follows:

To invoke a library at phase N:

   * Invoke at phase N any library that is imported by this library
     for run time, and that is not yet invoked at phase N.
   * Evaluate all variable definitions and top-level expressions within
     the library. (Macro definitions are not evaluated.)

To visit a library at phase N:

   * For each k >= 1, invoke at phase N+k any library that is imported
     by this library for .... (phase k), and that is not yet invoked at
     phase N+k.
   * For each k >= 0, visit at phase N+k any library that is imported by
     this library for .... (phase k), and that is not yet visited at phase
     N+k.
   * Evaluate all syntax definitions within the library.
     (Top-level expressions are not evaluated, and the right-hand sides
     of variable definitions are not evaluated.)

Technical remarks:
------------------

* We do not enforce the no-shadowing and no-multiple-import
  constraints.
* We allow different bindings for the same identifier to be
  imported into different phases.

See the link for further description and commented examples.

Regards
Andre