Syntax and conditional compilation

Syntax: cond-expand cond-expand-clause* [(else command-or-definition*)]

cond-expand-clause ::= (feature-requirement command-or-definition*)
feature-requirement ::= feature-identifier
  | (and feature-requirement*)
  | (or feature-requirement*)
  | (not feature-requirement)
feature-identifier ::= a symbol which is the name or alias of a SRFI

The cond-expand form tests for the existence of features at macro-expansion time. It either expands into the body of one of its clauses or signals an error during syntactic processing. cond-expand expands into the body of the first clause whose feature requirement is currently satisfied; the else clause, if present, is selected if none of the previous clauses is selected.

A feature requirement has an obvious interpretation as a logical formula, where the feature-identifier variables have meaning true if the feature corresponding to the feature identifier, as specified in the SRFI registry, is in effect at the location of the cond-expand form, and false otherwise. A feature requirement is satisfied if its formula is true under this interpretation.

Examples:

(cond-expand
    ((and srfi-1 srfi-10)
     (write 1))
    ((or srfi-1 srfi-10)
     (write 2))
    (else))
(cond-expand
  (command-line
   (define (program-name) (car (argv)))))

The second example assumes that command-line is an alias for some feature which gives access to command line arguments. Note that an error will be signaled at macro-expansion time if this feature is not present.

You can use java-6 or java-6 to check for Java 6 or Java 7, respectively, at compile-time.

You can use class-exists:ClassName to check if ClassName exists at compile-time.

Syntax: include path

Read the contents of the file at path as a sequence of forms, and treat the result as if the resulting forms were the forms of a begin.

Syntax: include-relative path

Same as include, except that the path is relative to the path of the source-file containing the include-file.