Well, I made my own modified version of syntax/parse that lets you define ~separated as a pattern-expander that let’s you do this: #lang racket (require (for-syntax syntax-parse-with-pattern-expanders (for-syntax racket/base)))
(begin-for-syntax (define-splicing-syntax-class binding #:literals (=) [pattern (~seq name:id = expr:expr)]) (define-syntax ~separated (pattern-expander (lambda (stx) (syntax-case stx () [(separated sep pat) (with-syntax ([ooo '...]) #'((~seq pat (~or (~peek-not _) (~seq sep (~peek _)))) ooo))])))) (define-splicing-syntax-class bindings [pattern (~separated (~datum /) b:binding) #:with (name ...) #'(b.name ...) #:with (expr ...) #'(b.expr ...)])) (define-syntax (my-let stx) (syntax-parse stx [(_ bs:bindings body) #'(let ([bs.name bs.expr] ...) body)])) (my-let (x = 1 / y = 2 / z = 3) (+ x y z)) It’s on github here: https://github.com/AlexKnauth/syntax-parse-with-pattern-expanders I haven’t tested it on anything other than this example though. On Jun 26, 2014, at 3:44 PM, Jens Axel Søgaard <jensa...@soegaard.net> wrote: > Hi All, > > The example program below defines a macro, my-let, that > enables you to write let-bindings with / as a separator. > > (my-let (x = 1 / y = 2 / z = 3) > (+ x y z)) > > I'd like to improve the definition of the syntax class called bindings. > Ideally I'd like to replace its definition with: > > (begin-for-syntax > (define-splicing-syntax-class bindings > [pattern (~separated / b:binding) > #:with names #'(b.name ...) > #:with expressions #'(b.expression ...)])) > > But how can I define the fictitious ~separated ? > > /Jens Axel > > > #lang racket > (require (for-syntax syntax/parse)) > > (begin-for-syntax > (define-splicing-syntax-class binding #:literals (=) > [pattern (~seq name:id = expression:expr)]) > > (define-splicing-syntax-class bindings > [pattern () > #:with names #'() > #:with expressions #'()] > [pattern (b:binding) > #:with names #'(b.name) > #:with expressions #'(b.expression)] > [pattern (b:binding (~seq / b*:binding) ...) > #:with names #'(b.name b*.name ...) > #:with expressions #'(b.expression b*.expression ...)])) > > (define-syntax (my-let stx) > (syntax-parse stx > [(_ bs:bindings body) > (with-syntax ([(name ...) #'bs.names] > [(expr ...) #'bs.expressions]) > #'(let ([name expr] ...) > body))])) > > (my-let (x = 1 / y = 2 / z = 3) > (+ x y z)) > > -- > Jens Axel Søgaard > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users
____________________ Racket Users list: http://lists.racket-lang.org/users