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-sop.inria.fr/indes/fp/Bigloo/doc/r5rs.html.

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.
.keep

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.
.keep
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)))

Revised(5) macro expansion

Bigloo support the Revised(5) Report on the Scheme programming language. For a detailed documentation see R5RS.

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.
.keep