This site is a static rendering of the Trac instance that was used by R7RS-WG1 for its work on R7RS-small (PDF), which was ratified in 2013. For more information, see Home.

Source for wiki CondExpandCowan version 2











== Conditional Expansion of Modules ==

This is a proposal for a `cond-expand` facility within the R7RS module language.  The syntax is the same as [ SRFI 0], but the bodies are declarations in the module language (ModulesShinn) rather than Scheme expressions.  This makes it possible, for example, to conditionally include a file of code based on the specific implementation or some feature of the implementation, or to conditionally import a module by name provided that module exists.

In this version, an implementation or implementation feature is named by a symbol, and a module is named by a list whose first element is not `and`, `or`, or `not`.  The meaning of a module name is "the module with this name is available for import, whether it is currently imported or not".

== Syntax ==

We add a new type of module declaration, <conditional expansion form>, with the following syntax:

<conditional expansion form>
    --> (cond-expand <cond-expand clause>+)
      | (cond-expand <cond-expand clause>* (else <module declaration>*))
<cond-expand clause>
    --> (<feature requirement> <module declaration>*)
<feature requirement>
    --> <feature identifier>
      | <module name>
      | (and <feature requirement>*)
      | (or <feature requirement>*)
      | (not <feature requirement>)
<feature identifier>
    --> a symbol
<module name>
    --> a list of symbols or exact integers

== Semantics ==

Each implementation maintains a list of feature identifiers which are present, as well as a list of modules which may be imported.  The semantics of a <feature requirement> are that if each feature identifier and module name on the implementation's list is replaced by `#t` and all other feature identifiers and module names are replaced by `#f`, and the resulting expression is evaluated as Scheme, then the corresponding <module declarations> are part of the module iff the result of the evaluation is `#t`.

== Standard feature identifiers ==

An implementation MAY provide any or all of these feature identifiers, as well as any others that it chooses, but MUST NOT provide a feature identifier if it does not provide the corresponding feature.

||Feature identifier||Feature description||
||`thing-one` (temporary name)||All R7RS Scheme implementations have this feature.||
||`exact-closed`||All rational operations on exact values produce exact values, with the possible exception of /.  If an implementation restriction is reached, an error is signaled.  If this feature identifier is missing, some results may be inexact.||
||`ratios`||`/` with exact arguments produces an exact result.||
||`ieee-float`||Inexact numbers are IEEE 754 floating point values.  This implies support for `+inf.0`, `-inf.0`, `+nan.0`, and `-0.0`.||
||`full-unicode`||All Unicode characters are supported.||
||`windows`||This Scheme implementation is running on Windows.||
||`posix`||This Scheme implementation is running on a Posix system.||
||`unix, darwin, linux, bsd, netbsd, openbsd, freebsd, solaris, ...`||Operating system flags (more than one may apply).||
||`i386, x86_64, ppc, sparc, sparc64, jvm, clr, llvm,` ...||CPU architecture flags.||
||`ilp32, lp64, ilp64,` ...||C memory model flags||
||`big-endian, little-endian`||Byte order flags.||
||''name''||The name of this implementation.||
||''name''`-`''version''||The name and version of this implementation.||


2010-12-04 07:54:32