You want ~once. See http://docs.racket-lang.org/syntax/stxparse-patterns.html?q=syntax-parse#%28form._%28%28lib._syntax%2Fparse..rkt%29._~7eonce%29%29 and http://docs.racket-lang.org/syntax/More_Keyword_Arguments.html?q=syntax-parse.
On Sun, Apr 7, 2013 at 5:23 PM, Scott Klarenbach <sc...@pointyhat.ca> wrote: > Hi there, > > I'd like to create a macro that accepts non-optional keyword arguments in > any order. It should however, ensure that all the arguments are provided. > Finally, it should not allow duplicates. > > So far I've only been able to solve for my first criteria. > > As a test, I have this: > > (syntax-parse stx > [(a:id b:id (~or (~seq #:key1 c:id) (~seq #:key2 d:id)) ...) #t]) > > Now, that matches for: > #'(a b #:key1 hey #:key2 there) > #'(a b #:key2 there #:key1 hey) > > Which is what I want. But unfortunately it also matches: > #'(a b #:key2 there) > > And worse: > #'(a b #:key2 one #:key2 two #:key2 three) > > The reasons are obvious. I'm just wondering if there's a more robust way of > dealing with these types of scenarios that I'm missing? I thought of > combining an (~or (~and clause but that becomes very tedious, and leaves the > duplicate problem unsolved. > > Thanks. > > -- > Talk to you soon, > > Scott Klarenbach > > PointyHat Software Corp. > www.pointyhat.ca > p 604-568-4280 > e sc...@pointyhat.ca > 200-1575 W. Georgia > Vancouver, BC V6G2V3 > > _______________________________________ > To iterate is human; to recur, divine > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users > ____________________ Racket Users list: http://lists.racket-lang.org/users