Version 1 was what I meant by not duplicating work, and version 2 seems much too complicated.
It looks like syntax/parse/experimental/eh, does what I need. On Sun, May 5, 2013 at 1:11 PM, J. Ian Johnson <[email protected]> wrote: > One way is to have your ~or form in an ~and with a catch-all where you can > observe the ordering. > That is, > (~and (~seq forms ...) (~seq (~or (~optional (~seq #:kw0 kw0)) ...others...) > ...)) > Then walk through (forms ...) when you're outputting your changed keyword > arguments to determine which to output. Say, build a table of keyword to > output for that keyword. > You could also trust that syntax-parse will parse your dotted ~or in order > and have ~do forms that populate a data structure via mutation and bump up a > counter each time. > > -Ian > ----- Original Message ----- > From: "Eric Dobson" <[email protected]> > To: [email protected] > Sent: Sunday, May 5, 2013 3:58:31 PM GMT -05:00 US/Canada Eastern > Subject: [racket] syntax-parse and matching ordered optional keyworded > expressions > > I'm trying to improve the struct: form in TR, and one of the things I > need to do is match a sequence of keyworded expressions, add > annotations on the expressions, and then put them back into the same > order. > > I can either do a large ~or clause and have optional constraints on > each clause, but If I do this then each kind of clause needs a > different name and then putting them back in the same order is > difficult. If I make a syntax class with each kind of clause then I > don't know how to enforce the at most one constraint. > > Is there a way to do this with out duplicating the parsing work? > > Method 1: > (~or > (~optional guard:guard-form) > (~optional mutable:mutable-form) > property:struct-property-form) ... > and > #'(guard.contracted mutable.contracted property.contracted ...)) > > Method 2: > (define-splicing-syntax-class any-form > (pattern :guard-form) > (pattern :mutable-form) > (pattern :struct-property-form)) > (form:any-form ...) > and > #'(form.contracted ...) > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users

