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 adefine-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 forlet-syntax
and letrec-syntax
. Hygienic expansion is
only guaranteed for define-syntax
.
.keep