For most pattern-matching purposes, racket/match is a better choice than syntax/datum. The syntax/datum library is useful mainly for its template support (i.e., datum ) and, to a lesser extent, its direct correspondence to syntax-case patterns.
syntax
clause...)syntax
( datum template)
Using datum-case and datum is similar to converting the input to syntax-case using datum->syntax and then wrapping each use of syntax with syntax->datum , but datum-case and datum do not create intermediate syntax objects, and they do not destroy existing syntax objects within the S-expression structure of datum-expr.
The datum form also cooperates with syntax pattern variables such as those bound by syntax-case and attributes bound by syntax-parse (see Pattern Variables and Attributes for more information about attributes). As one consequence, datum provides a convenient way of getting the list of syntax objects bound to a syntax pattern variable of depth 1. For example, the following expressions are equivalent, except that the datum version avoids creating and eliminating a superfluous syntax object wrapper:
'(#<syntax:eval:3:0 a> #<syntax:eval:3:0 b> #<syntax:eval:3:0 c>)
'(#<syntax:eval:4:0 a> #<syntax:eval:4:0 b> #<syntax:eval:4:0 c>)
A template can also use multiple syntax or datum pattern variables and datum constants, and it can use the ~@ and ~? template forms:
'((#<syntax:eval:5:0 a> -> 1)
(#<syntax:eval:5:0 b> -> 2)
(#<syntax:eval:5:0 c> -> 3))
'(#<syntax:eval:6:0 a> 1 #<syntax:eval:6:0 b> 2 #<syntax:eval:6:0 c> 3)
See Attributes and datum for examples of ~? with datum .
If a datum variable is used in a syntax template, a compile-time error is raised.
Changed in version 7.8.0.9 of package base: Changed datum to cooperate with syntax-case , syntax-parse , etc.
syntax
body...+)
'((1 "x") (2 "y") (3 "z"))
syntax
( define/with-datum patterndatum-expr)
'((a1)(b2)(c3)))'((a b c) (1 2 3))
Added in version 8.2.0.8 of package base.
syntax
( quasidatum template)
syntax
( undatum expr)
syntax
( undatum-splicing expr)
'(0 1 2 3 4)