<div dir="ltr">With syntax/parse, would it be possible to make syntax classes first class values instead of just a macro extension on top of syntax parse? That way you could parameterize syntax classes over arbitrary values, including other syntax classes, to create composable syntax classes. For instance, I find it very common when writing complex macros that I need to represent a series of optional keyword clauses like so:<div><br></div><div>(define-syntax foo</div><div>  (syntax-parser</div><div>    [(_ req1 req2</div><div>         (~optional (~or (~seq #:kw1 op1)<br>                                 (~seq #:kw2 op2)</div><div>                                 (~seq #:kw3 op3)))</div><div>         ...)</div><div>     ; do something ]))</div><div><br></div><div>But this allows for items to be repeated and can be very verbose if the clauses are complex. I can define a syntax class for each of the optional clauses:</div><div><br></div><div>(define-splicing-syntax-class op1</div><div>  (pattern (~seq #:kw1 op1-pattern)))</div><div><br></div><div>(define-splicing-syntax-class op2</div><div>  ...</div><div>...</div><div><br></div><div>I'd like to also be able to define a function that takes those syntax classes and returns a new syntax class representing an optional series of any of those classes where each can be given once:</div><div><br></div><div>(define (optional-sequence-of class-a class-b class-c)</div><div>  (splicing-syntax-class</div><div>    (pattern (~optional (~or (~once (~var a class-a))</div><div>                                          (~once  (~var b class-b))</div><div>                                          (~once (~var c class-c)))) ...)))</div><div><br></div><div>And then my original macro would just be:</div><div><br></div><div>(define-syntax foo</div><div>  (syntax-parser</div><div>    [(_ req1 req2 (~var optionals optional-sequence-of op1 op2 op3))</div><div>    ; do something ]))</div><div><br></div><div>The reason I think this would be useful is that you could re-use the optional-sequence-of class in other macros since it's generalized. You can make some general "template" syntax classes for common macro tasks, such as a sequence of pairs of unbound unique identifiers with expressions (for let-like macros) or for a definition of a function's arguments (so Racket's definition of a function ((f a b) g) and Typed Racket's definition of a function ((f [a : Number] [b : Number]) [g : Number Number -> Number) could re-use a lot of the same macro plumbing).</div><div><br></div><div>I don't know how possible this is, or what issues would need to be ironed out to make it particularly useful, but I welcome any thoughts on the matter.</div></div>