This is such a common pattern that there is support for it with a feature called syntax templates, in syntax/parse/experimental/template. You would use (?? super) to add super only if it's given, and nothing otherwise. -Ian ----- Original Message ----- From: Laurent <laurent.ors...@gmail.com> To: Konrad Hinsen <konrad.hin...@fastmail.net> Cc: users <users@racket-lang.org> Sent: Wed, 25 Sep 2013 06:17:30 -0400 (EDT) Subject: Re: [racket] Macros: dealing with optional elements
On Wed, Sep 25, 2013 at 11:31 AM, Konrad Hinsen <konrad.hin...@fastmail.net>wrote: > > (define-syntax (foo stx) > (syntax-parse stx > [(_ id:id (~optional super:id) (field:id ...)) > (if (attribute super) > #'(struct id super (field ...)) > #'(struct id (field ...)))])) Unsyntax-splicing to the rescue! #lang racket (require (for-syntax syntax/parse)) (define-syntax (foo stx) (syntax-parse stx [(_ id:id (~optional super:id) (field:id ...)) #`(struct id #,@(if (attribute super) (list #'super) '()) (field ...)) ])) (struct A (a)) (foo B (b)) (foo C A (c)) (A 1) (B 2) (C 3 4) Laurent ____________________ Racket Users list: http://lists.racket-lang.org/users