[racket] syntax-parse form at runtime

From: antoine (antoine597 at gmail.com)
Date: Thu Aug 29 15:44:17 EDT 2013

On 28/08/2013 23:27, Ryan Culpepper wrote:
> On 08/28/2013 04:59 PM, antoine wrote:
>> Hello,
>>
>> I would like play with macros, and for keep it as simple as possible i
>> decided
>> to work with macro at runtime, i just pass the arguments encapsulated 
>> in a
>> syntax object.
>>
>> But with the code under i get :
>>
>> test.rkt:8:16: syntax-parse: literal is unbound in phase 0 (phase 0
>> relative to the enclosing module)
>>    at: abc
>>    in: (syntax-parse stx #:literals (abc) ((abc elem:id ...+) (syntax 
>> 1)))
>>
>> Could you help me to decypher it ?
>
> syntax-parse (unlike syntax-rules and syntax-case) considers it an 
> error to specify a literal that has no binding. You can read my 
> thoughts on the subject here:
>
> http://macrologist.blogspot.com/2011/09/macros-and-literals.html
> http://macrologist.blogspot.com/2011/09/syntax-parse-and-literals.html
>
> There are two ways to fix your code.
>
> One way is to just add a definition of abc, any definition. If abc 
> doesn't have any meaning by itself, the usual idiom is a macro 
> definition that always raises an error:
>
>   (define-syntax abc
>     (lambda (stx)
>       (raise-syntax-error #f "not used as part of a parse-a form" stx)))
>
> Then your macro/function will recognize identifiers that refer to that 
> binding of abc. Which means, for example, that if you want code in 
> other modules to use your macro, you need to provide abc.
>
> The other way is to change your code to use #:datum-literal or ~datum 
> to recognize the identifier symbolically. But in that case, maybe a 
> keyword (eg #:abc) would be better.
>
> Ryan
>
>
>> I far as i understand it seems the '#:literals (abc)' put this into a
>> binding
>> 'literal' which is not available at runtime.
>>
>> Thank you.
>>
>> ;;----test.rkt----
>> #lang racket
>>
>> (require
>>   syntax/parse)
>>
>> (define (parse-a stx)
>>    (syntax-parse stx
>>      #:literals (abc)
>>      [(abc elem:id ...+)
>>       #'1]))
>>
>> (parse-a #'(abc a b c))
>> ;;----test.rkt----
>>
>> ____________________
>>   Racket Users list:
>>   http://lists.racket-lang.org/users
>

Thanks you.

I will use #:datum-literal.

Posted on the users mailing list.