Am 07.01.2017 um 13:02 schrieb Jim Rees:
> "If the transformer spec is a keyword, the keyword bound to the
> transformer spec essentially becomes an alias to the syntactic keyword
> keyword. (Keyword may also be one of the core syntactic keywords like
> lambda, if, define.) The same holds if the transformer spec is a macro
> use that eventually expands into a (possibly empty) sequence of
> multiple definitions followed by the keyword (possibly bound by the
> introduced definitions)."
>
> Could you elaborate more or give examples of the what the second
> sentence implies? Is this sequence you refer to a (begin ...)
> form? If so, and if it contains definitions as you suggest, what is
> their scope? Can those definitions include both variable and syntax
> definitions?
Yes, by sequence I mean a sequence introduced by `begin'. For example:
(define-syntax foo
(begin
(define-syntax bar lambda)
bar))
In principle, these definitions can contain variable and syntax
definitions; for the purpose of writing custom macro transformers,
however, syntax definitions is all that is needed.
The scope of these definitions is described in the SRFI:
In case of (define-syntax foo (...)), the definitions introduced by
(...) are in the same scope as the definition of foo itself.
In case of (let-syntax ((foo (...))) ...), the definitions introduced by
(...) are in a scope between the outer and the inner scope of
let-syntax. For example,
(let-syntax ((foo (begin (define-syntax bar lambda) bar))) ...)
is equivalent to
(let () (define-syntax bar lambda) (let-syntax ((foo bar)) ...)).
In case of (letrec-syntax ((foo (...))) ...), the definitions introduced
by (...) are in the scope of the bindings of letrec-syntax (i.e. in the
scope where foo is defined).
The reasons for these rules are:
1) This SRFI should be implementable in R7RS-small.
2) The rules should be as intuitive as possible.
3) Sophisticated custom macro transformers (as the one in SRFI 148)
should be implementable in R7RS-small.
--
Marc