Basically, the difference is as follows: #:literals compares
identifiers using free-identifier=?, but #:datum-literals compares
them by using syntax-e and eq?.
You can observe the difference using two extremely simple macros
that only differ in their use of #:literals or #:datum-literals:
(define-syntax lit
(syntax-parser
#:literals [add1]
[(_ add1) #'"add1"]
[(_ _) #'"something else"]))
(define-syntax dat
(syntax-parser
#:datum-literals [add1]
[(_ add1) #'"add1"]
[(_ _) #'"something else"]))
Observe the behavior of the `lit` macro:
> (lit add1)
"add1"
> (let ([add1 #f])
(lit add1))
"something else"
> (require (rename-in racket/base [add1 my-add1]))
> (lit my-add1)
"add1"
Contrast the results with the same examples using the `dat` macro
instead:
> (dat add1)
"add1"
> (let ([add1 #f])
(dat add1))
"add1"
> (require (rename-in racket/base [add1 my-add1]))
> (dat my-add1)
"something else"
By “recognize symbolically”, it means that #:datum-literals looks
at the name of the symbol and nothing else. In contrast, #:literals
is more advanced, since it looks for an identifier with the same
binding as the one specified.
In my opinion, when in doubt, prefer #:literals.
> On Jan 10, 2017, at 11:58 AM, Deren Dohoda <[email protected]>
> wrote:
>
> I am still making most macros using syntax-rules and syntax-case
> because when I happened to learn macros these were the paths of
> least resistance. Every once in a while I try to learn a little
> more of syntax-parse since the few times I've tried it I really
> liked it.
>
> It appears that, in general, syntax-rules and syntax-case use what
> syntax-parse considers "datum-literals", which the docs say are
> recognized "symbolically" versus actual literals which are recognized
> "by binding." The example in the documents for some reason clarifies
> nothing since both expressions are the same and give the same output,
> making this a distinction without an obvious difference.
>
> Can someone explain the intention behind #:literals as opposed to
> #:datum-literals? In what cases should I consider #:literals? Why
> would I want to avoid #:datum-literals, or vice versa?
>
> Thanks,
> Deren
--
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.