Gotcha! Thanks! And also thanks Alex, you gave me the right answer, I just 
didn't understand.

On Monday, July 24, 2017 at 2:28:32 PM UTC-4, Philip McGrath wrote:
> The error message from `id:my-id` seems very confusing. You can't use the 
> colon notation with syntax classes that take arguments. You have to write 
> something like:
> 
> 
> 
> (define-syntax (my-let stx)
>   (syntax-parse stx
>     [(_ ([id binding] ...) body ... last-body)
>      #:declare id (my-id 'let "an identifier to bind")
>      #'(let ([id binding] ...) body ... last-body)]))
> 
> 
> You might want to look at `expr/c` for an example of a syntax class that 
> takes arguments: 
> http://docs.racket-lang.org/syntax/Library_Syntax_Classes_and_Literal_Sets.html?q=~expr%2Fc#%28def._%28%28lib._syntax%2Fparse..rkt%29._expr%2Fc%29%29
> 
> 
> 
> -Philip
> 
> 
> 
> On Mon, Jul 24, 2017 at 1:18 PM, Sam Waxman <[email protected]> wrote:
> Sorry, I think I need to elaborate a bit more!
> 
> 
> 
> I've written code as follows
> 
> 
> 
> (define-syntax-class my-id
> 
>   (pattern id
> 
>     #:do (if (identifier? #'id) (values)
> 
>              (raise-user-error (~a "Expected id: " (syntax->datum #'id))))))
> 
> 
> 
> (define-syntax (my-let stx)
> 
>   (syntax-parse stx
> 
>     [(_ ([id:my-id binding] ...) body ... last-body)
> 
>      #'(let ([id binding] ...) body ... last-body)]))
> 
> 
> 
> (define-syntax (reassign stx)
> 
>   (syntax-parse stx
> 
>     [(_ id:my-id new-value)
> 
>       #'(set! id new-value)]))
> 
> 
> 
> ... other syntax rules using my-id as a syntax class
> 
> 
> 
> I enjoy using syntax classes to check that my arguments are id's, but what I 
> don't enjoy is how limited my error message is. (I don't want to use Rackets. 
> The end users for this are students using very simple self-defined languages, 
> and the error messages should be very intuitive, so my-id
> 
> is just id but with my own error.)
> 
> 
> 
> What I'd like to do is format my errors more like
> 
> "let: Expected an identifier to bind but got 3"
> 
> "reassign: Expected an identifier to reassign but got 3."
> 
> 
> 
> The way I planned to do this was to pass arguments into my syntax class. In 
> the racket documentation, it states this is possible. The forms of 
> define-syntax-class are as follows.
> 
> 
> 
> (define-syntax-class name-id stxclass-option ...
> 
>   stxclass-variant ...+)
> 
> (define-syntax-class (name-id . kw-formals) stxclass-option ...
> 
>   stxclass-variant ...+)
> 
> 
> 
> I'm hoping to use the second form to write something like the following
> 
> 
> 
> (define-syntax-class (my-id name description)
> 
>   (pattern id
> 
>     #:do (if (identifier? #'id) (values)
> 
>              (raise-syntax-error name
> 
>                  (~a " expected " description but got (syntax->datum 
> #'id))))))
> 
> 
> 
> This way I could write my let as
> 
> 
> 
> (define-syntax (my-let stx)
> 
>   (syntax-parse stx
> 
>     [(_ ([id:(my-id 'let "an identifier to bind") binding] ...) body ... 
> last-body)
> 
>      #'(let ([id binding] ...) body ... last-body)]))
> 
> 
> 
> (or to make this look cleaner, I could have a line of code before this that 
> says (define let-id (my-id 'let "an identifier to bind")) I don't think that 
> would exactly work, but I'm sure it's doable in some way)
> 
> 
> 
> The only thing I'm having problems with is that apparently that isn't the 
> right way to use the formals. When I try writing it the original way but with 
> the updated my-id version, I get
> 
> 
> 
> id:my-id: expected 1 positional argument; got 0 positional arguments in: 
> id:my-id
> 
> 
> 
> and when I write it with the parentheses like I did in the last example I get
> 
> 
> 
> my-let: expected more terms at: () within: (my-let ([x 2]) 1) in: (my-let ([x 
> 2]) 1)
> 
> 
> 
> On Monday, July 24, 2017 at 1:19:06 PM UTC-4, Alex Knauth wrote:
> 
> 
> 
> > On Jul 24, 2017, at 1:06 PM, Sam Waxman <[email protected]> wrote:
> 
> >
> 
> >
> 
> > Probably a silly question but I can't figure out how to get this working.
> 
> >
> 
> > I want to have a syntax class that I can pass arguments into. So,
> 
> >
> 
> > (define-syntax-class (my-syn-class argument)
> 
> >   ...
> 
> > )
> 
> >
> 
> > (syntax-parse #'some-syntax
> 
> >   [(_ x:*????*)])
> 
> >
> 
> >
> 
> > In place of *????* what do I write to pass the argument into my syntax 
> > class?
> 
> > I tried
> 
> >
> 
> > (syntax-parse #'some-syntax
> 
> >   [(_ x:(my-id *my-argument*)])
> 
> >
> 
> > but this doesn't appear to work.
> 
> >
> 
> > Thanks in advance!
> 
> >
> 
> >
> 
> > You have to use either ~var [1] or #:declare [2].
> 
> >
> 
> >
> 
> >   [1]: 
> > http://docs.racket-lang.org/syntax/stxparse-patterns.html#%28elem._%28pattern-link._%28~7evar._s%2B%29%29%29
> 
> >   [2]: 
> > http://docs.racket-lang.org/syntax/stxparse-specifying.html#%28part._.Pattern_.Directives%29
> 
> 
> 
> --
> 
> You received this message because you are subscribed to the Google Groups 
> "Racket Users" group.
> 
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> 
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to