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

From: Carl Eastlund (cce at ccs.neu.edu)
Date: Tue Aug 30 13:41:48 EDT 2011

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/



Posted on the users mailing list.