[racket] Improvement of a syntax-parse syntax class definition

From: Jens Axel Søgaard (jensaxel at soegaard.net)
Date: Sun Jun 29 05:20:04 EDT 2014

Hi Alexander,

That's a very nice solution!

Now we just need to lobby for pattern expanders to appear in the
official syntax-parse!

/Jens Axel



2014-06-27 5:55 GMT+02:00 Alexander D. Knauth <alexander at knauth.org>:
> 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 <jensaxel at 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
>
>



-- 
--
Jens Axel Søgaard


Posted on the users mailing list.