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.

Reply via email to