syntax
#:attributes[attr-arity-decl...]reified-classes-expr)head = name-id| (name-idparameters)parameters = parameter...| parameter....rest-idparameter = param-id| [param-iddefault-expr]| #:keywordparam-id| #:keyword[param-iddefault-expr]attr-arity-decl = attr-name-id| [attr-name-iddepth]
The syntax-parse reflection interface (~reflect ) allows you to fill in a syntax class at runtime, which lets you leave a variant to be filled in from somewhere else. However, the ~reflect pattern only allows one syntax class, and that syntax class must include all the non-built-in variants, still limiting it to what some centralized parser can depend on. And still the number of new variants is limited to fixed number at compile time.
The define-syntax-class/or* form allows you to define a syntax class that combines a list of arbitrarily many variants into one parser. The list of variants can be computed at run time (relative to the parser) or can be passed in as arguments.
#:datum-literals[^]#:attributes[op[sub1]]> (parse#'[x])#<syntax:eval:8:0 x>
#<syntax:eval:7:0 (+ (* a (expt x 2)) (* b x) c)>
#<syntax:eval:7:0 (+ (* (expt a b) c) (* 2 d) 3)>
#<syntax:eval:7:0 (+ (expt 2 (expt 10 x)) (* -1 y))>