On Sun, Jul 03, 2011 at 04:44:46PM -0400, Noah Lavine wrote:
> I agree that this is much shorter, but I'm worried about defining the
> short syntax in a way that forces you to choose between syntax-rules
> and syntax-case.
Except, it doesn't. My version doesn't insert either syntax-case or
syntax-rules; it just inserts the lambda and lets you do whatever.
Granted, in practice that makes the shortcut useful for syntax-case
only, but at least it's highly consistent with how define's shortcut
works, and should therefore be less confusing.
> What I mean is that you could just as easily have
>
> (define-syntax (foo bar)
> ...)
>
> expand to
>
> (define-syntax foo
> (syntax-rules ()
> ((_ bar) ...)))
Racket resolves this by having a macro called define-syntax-rule, which
allows you to define a one-branch syntax-rules macro. Thus these two
macros are identical:
(define-syntax-rule (foo bar baz) (...))
(define-syntax foo
(syntax-rules ()
((_ bar baz) (...))))
> It seems to me that this makes a somewhat arbitrary choice, which
> isn't great. I'd rather see some way to unify the two possibilities,
> but I don't know what that would be. There's also the possibility of
> making it expand to
>
> (define-syntax foo
> (syntax-case tmp ...
> ((bar) ...)))
>
> because it is more analogous to how regular procedures work.
The problem with this is that this then favours the one-branch variant,
which is not a common case for syntax-case macros.
Cheers,
Chris.