13. Bigloo -- Macro expansion

Browsing
Home: | Bigloo A ``practical Scheme compiler'' User manual for version 2.6b December 2003
Previous chapter: | Eval and code interpretation
Next chapter: | Command Line Parsing
Macro expansion
13.1 | Expansion passing style macros
13.2 | Revised(5) macro expansion
Chapters
| Acknowledgements
1. | Table of contents
2. | Overview of Bigloo
3. | Modules
4. | Core Language
5. | Standard Library
6. | Pattern Matching
7. | Object System
8. | Threads
9. | Regular parsing
10. | Lalr(1) parsing
11. | Errors and Assertions
12. | Eval and code interpretation
13. | Macro expansion
14. | Command Line Parsing
15. | Explicit typing
16. | The C interface
17. | The Java interface
18. | Bigloo Libraries
19. | Extending the Runtime System
20. | SRFIs
21. | DSSSL support
22. | Compiler description
23. | User Extensions
24. | Bigloo Development Environment
25. | Global Index
26. | Library Index
| Bibliography
| Bigloo make uses 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.
13.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 a 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)))

13.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 Scribe page has been generated by `scribeinfo`.
Last update Tue Dec 16 13:46:41 2003