24. Bigloo
A practical Scheme compiler
User manual for version 4.2a
September 2015 -- Macro expansion
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/indes/fp/Bigloo/doc/r5rs.html.

24.1 Expansion passing style macros

define-expander name procbigloo 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]...) bodybigloo 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))
           (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)))

24.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...) bodysyntax
letrec-syntax (binding...) bodysyntax
define-syntax keyword transformersyntax
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 Thu Sep 3 08:07:38 2015.