[racket] bad syntax; literal data is not allowed, because no #%datum syntax transformer is bound

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Tue Aug 30 14:10:18 EDT 2011

Can the thing coming out of the read-syntax be an expression? If so,
what lexical context should it have?

Robby

On Tue, Aug 30, 2011 at 1:00 PM, Carl Eastlund <cce at ccs.neu.edu> wrote:
> Oops.  It's not NAME that's the problem.  It's #,my-read-stx that
> needs to change to (quote #,my-read-stx) instead.
>
> Carl Eastlund
>
> On Tue, Aug 30, 2011 at 1:41 PM, Carl Eastlund <cce at ccs.neu.edu> wrote:
>> Just put an explicit "quote" form around it.  Replace NAME with (quote
>> NAME) in the template.
>>
>> Right now there is no form to tell the expander how to expand NAME.
>> So the expander looks at the lexical context to see "how do I expand
>> this form".  But NAME did not come from a lexical context, so it has
>> none.  You don't really want to give it some, either -- it's not a
>> program, it's data.  Wrapping it with quote tells the expander what it
>> needs to know via the context on the identifier "quote", and NAME can
>> thus stay as data without lexical context.
>>
>> Carl Eastlund
>>
>> On Tue, Aug 30, 2011 at 6:42 AM, Neil Van Dyke <neil at neilvandyke.org> wrote:
>>> I'm getting this error in some code with a macro transformer that produces
>>> syntax that includes some bits of child syntax that are sourced via
>>> "read-syntax".
>>>
>>> The below example demonstrates.
>>>
>>> Assuming that I really do want to use "read-syntax", how do I do this
>>> properly?  (I assume that proper is not losing the "#%datum" by something
>>> like "(quasisyntax/loc stx #,(syntax->datum stx))".)
>>>
>>>
>>> #lang racket/base
>>>
>>> (require (for-syntax   racket/base) ;; necessary
>>>        (for-template racket/base) ;; doesn't help #%datum problem
>>>        (for-label    racket/base) ;; doesn't help #%datum problem
>>>        )
>>>
>>> (define-syntax (my-macro stx)
>>>  (syntax-case stx ()
>>>   ((_ NAME) (let ((my-read-stx (read-syntax "my-sourcename"
>>>                                             (open-input-string
>>> "\"hello\""))))
>>>               (quasisyntax/loc stx
>>>                 (string-append "Well, " #,my-read-stx ", " NAME "!"))))))
>>>
>>> (my-macro "yourname")
>>> ;;=exception=> compile: bad syntax; literal data is not allowed, because no
>>> #%datum syntax transformer is bound in: "hello"
>>>
>>>
>>> --
>>> http://www.neilvandyke.org/
>
> _________________________________________________
>  For list-related administrative tasks:
>  http://lists.racket-lang.org/listinfo/users
>



Posted on the users mailing list.