Next: stdlib syntax-case intro more, Previous: stdlib syntax-case intro unwrap, Up: stdlib syntax-case intro [Index]
Here is an example implementation of the receive
syntax, giving a
condensed interface to call-with-values
:
(import (rnrs) (for (syntax-utilities) expand)) (define-syntax receive (lambda (use) (let ((sexp (unwrap use))) (let ((formals (cadr sexp)) (expression (caddr sexp)) (body (cdddr sexp))) `(,(syntax call-with-values) (,(syntax lambda) () ,expression) (,(syntax lambda) ,formals . ,body)))))) (receive (a b) (values 1 2) (write 'ciao) (list a b)) → (call-with-values (lambda () (values 1 2)) (lambda (a b) (write 'ciao) (list a b)))
The transformer of the receive
macro extracts datums and
identifiers from the input form using the common list functions
car
, cdr
, … and, for simplicity, it performs no
checks to verify that the input form has the required structure (for
example: it does not check that the first element after the syntactic
keyword receive
is a list of identifiers).
The syntax-case
macro, exported by the library
(rnrs syntax-case (6))
, provides a way to both extract elements from
a syntax object and to perform basic checks on its structure; it is
usually more convenient and efficient to use syntax-case
for
macro–specific processing, rather than to unwrap the input form and
process the result.