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