(define-syntax test (syntax-rules () ((test (x ...) ((y ...) ...) ) '((x (x y) ...) ...) ) ) ) (test (a b c) ((1 2 3) (4 5 6) (7 8 9)) )I'm not sure if this is an error since
(x (x y) ...)contains 2 times x followed by an ellipsis. (I think it is, and SRFI-72 expander, a.k.a Van Tonder expander, signals an error.) So I've removed the first x and tested on couple of R6RS and R7RS implementations.
;; Removed the first x (define-syntax test (syntax-rules () ((test (x ...) ((y ...) ...) ) '(((x y) ...) ...) ) ) ) (test (a b c) ((1 2 3) (4 5 6) (7 8 9)) ) #| Either: #1 (((a 1) (b 2) (c 3)) ((a 4) (b 5) (c 6)) ((a 7) (b 8) (c 9))) Or #2 (((a 1) (a 2) (a 3)) ((b 4) (b 5) (b 6)) ((c 7) (c 8) (c 9))) |#Implementations emit the #1 are the following:
- All R6RS implementations
- Sagittarius using
Pattern variables that occur in subpatterns followed by one or more ellipses may occur only in subtemplates that are followed by (at least) as many ellipses. These pattern variables are replaced in the output by the input subforms to which they are bound, distributed as specified.
R6RS: 11.19 - Macro transformers
Pattern variables that occur in subpatterns followed by one or more instances of the identifier ellipsis are allowed only in subtemplates that are followed by as many instances of ellipsis . They are replaced in the output by all of the elements they match in the input, distributed as indicated.I think the difference between R6RS and R7RS is matched ellipses consuming part. R6RS also requires the following:
R7RS: 4.3.2 - Pattern language
The subtemplate must contain at least one pattern variable from a subpattern followed by an ellipsis, and for at least one such pattern variable, the subtemplate must be followed by exactly as many ellipses as the subpattern in which the pattern variable appears. (Otherwise, the expander would not be able to determine how many times the subform should be repeated in the output.)
This, I believe, restricts that input expressions of the multiple ellipses have the same length of input. In above example, x and y should have the same length. R7RS, on the other hand, requires to consume all input. Thus, x and y may have different length of inputs (e.g.
(test (a b c) ((1 2 3 10) (4 5 6) (7 8 9)))should be valid on above example). In such cases, the expander can't determine how it should be expanded if it needs to expand like R6RS does (as R6RS mentioned).
Maybe there's more direct statement which specifies the behaviour of this case.