Kawa, the Java-based Scheme system

Node:Syntax and conditional compilation, Next:Multiple values, Previous:Extensions, Up:Extensions

### Syntax and conditional compilation

define-syntax .. | Syntax

Pattern ...

defmacro name lambda-list form ... | Syntax

Defines an old-style macro a la Common Lisp, and installs `(lambda` lambda-list`` form`...)` as the expansion function for name. When the translator sees an application of name, the expansion function is called with the rest of the application as the actual arguments. The resulting object must be a Scheme source form that is futher processed (it may be repeatedly macro-expanded). If you define a macro with `defmacro`, you (currently) cannot use the macro in the same compilation as the definition. This restriction does not apply to macros defined by `define-syntax`.

gentemp | Function

Returns a new (interned) symbol each time it is called. The symbol names are implementation-dependent. (This is not directly macro-related, but is often used in conjunction with `defmacro` to get a fresh unique identifier.)

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

              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.