BiglooA ``practical Scheme compiler''User manual for version 3.1aMay 2008

18. Bigloo A ``practical Scheme compiler'' User manual for version 3.1a May 2008 -- Macro expansion

main page

top: | Bigloo A ``practical Scheme compiler'' User manual for version 3.1a May 2008

Macro expansion

Chapters

Bigloo makes use of two macro expansion system. The one based on the expansion passing style [Dybvig et al. 86] and the one advocated by the R5RS, for which see http://www.inria.fr/mimosa/fp/Bigloo/doc/r5rs.html.

### 18.1 Expansion passing style macros

define-expander name proc | bigloo syntax

This form defines an expander, `name`, where `proc` is a procedure of two arguments: a form to macro-expand, and an expander.

define-macro (name [args]...) body | bigloo syntax

This form is itself macro-expanded into a `define-expander` form.
Macro expanders cannot be exported or imported since there is no way to specify expanders in a module declaration.
Macros defined with `define-expander` and `define-macro` are used by both the compiler and the interpreter.

Here is an example of an expander:

    (define-expander when
       (lambda (x e)
          (match-case x
             ((?- ?test . ?exps)
              (e `(if ,test (begin ,@exps)) e))
             (else
               (error "when" "illegal form" x)))))

    (when (> a 0) (print a) a)
       ==> (if (> a 0) (begin (print a) a))

The same example can written with a `define-macro` form:

    (define-macro (when test . exps)
       `(if ,test (begin ,@exps)))

### 18.2 Revised(5) macro expansion

Bigloo support the Revised(5) Report on the Scheme programming language. For a detailed documentation see See r5rs, Expressions.

let-syntax (binding...) body | syntax

letrec-syntax (binding...) body | syntax

define-syntax keyword transformer | syntax

syntax-rules literals rule... | syntax

These three forms are compatible with the description of the Revised(5) Report on the Algorithmic Language Scheme.
Implementation Note: Current Bigloo does not ensure hygiene for `let-syntax` and `letrec-syntax`. Hygienic expansion is only guaranteed for `define-syntax`.

This Html page has been produced by Skribe.
Last update Wed May 28 08:36:19 2008.