r7rs-small-texinfo

Unnamed repository; edit this file 'description' to name the repository.
git clone https://kaka.farm/~git/r7rs-small-texinfo
Log | Files | Refs | README | LICENSE

formal-syntax.texinfo (24669B)


      1 @node Formal syntax
      2 @section Formal syntax
      3 
      4 This section provides a formal syntax for Scheme written in an
      5 extended BNF.
      6 
      7 All spaces in the grammar are for legibility.  Case is not significant
      8 except in the definitions of @svar{letter}, @svar{character name}
      9 and @svar{mnemonic escape}; for example, @code{#x1A} and @code{#X1a}
     10 are equivalent, but @code{foo} and @code{Foo} and @code{#\space} and
     11 @code{#\Space} are distinct.  @svar{empty} stands for the empty string.
     12 
     13 The following extensions to BNF are used to make the description
     14 more concise: @arbno{@svar{thing}} means zero or more occurrences
     15 of @svar{thing}; and @atleastone{@svar{thing}} means at least one
     16 @svar{thing}.
     17 
     18 @menu
     19 * Lexical structure::
     20 * External representations formal::
     21 * Expressions formal::
     22 * Quasiquotations::
     23 * Transformers::
     24 * Programs and definitions::
     25 * Libraries formal::
     26 @end menu
     27 
     28 @node Lexical structure
     29 @subsection Lexical structure
     30 
     31 @cindex token
     32 
     33 This section describes how individual tokens (identifiers, numbers,
     34 etc.) are formed from sequences of characters.  The following sections
     35 describe how expressions and programs are formed from sequences
     36 of tokens.
     37 
     38 @svar{Intertoken space} can occur on either side of any token, but
     39 not within a token.
     40 
     41 Identifiers that do not begin with a vertical line are terminated by
     42 a @svar{delimiter} or by the end of the input.  So are dot, numbers,
     43 characters, and booleans.  Identifiers that begin with a vertical
     44 line are terminated by another vertical line.
     45 
     46 The following four characters from the ASCII repertoire are reserved
     47 for future extensions to the language: @code{[ ] @{ @}}
     48 
     49 In addition to the identifier characters of the ASCII repertoire
     50 specified below, Scheme implementations may permit any additional
     51 repertoire of Unicode characters to be employed in identifiers,
     52 provided that each such character has a Unicode general category of Lu,
     53 Ll, Lt, Lm, Lo, Mn, Mc, Me, Nd, Nl, No, Pd, Pc, Po, Sc, Sm, Sk, So,
     54 or Co, or is U+200C or U+200D (the zero-width non-joiner and joiner,
     55 respectively, which are needed for correct spelling in Persian, Hindi,
     56 and other languages).  However, it is an error for the first character
     57 to have a general category of Nd, Mc, or Me.  It is also an error to
     58 use a non-Unicode character in symbols or identifiers.
     59 
     60 All Scheme implementations must permit the escape sequence
     61 @code{\x}@svar{hexdigits}@code{;} to appear in Scheme identifiers
     62 that are enclosed in vertical lines. If the character with the given
     63 Unicode scalar value is supported by the implementation, identifiers
     64 containing such a sequence are equivalent to identifiers containing
     65 the corresponding character.
     66 
     67 @cindex identifier
     68 @cindex comment
     69 
     70 @c TODO: Better alignment in output.
     71 @indentedblock
     72 
     73 @svar{token} @expansion{} @svar{identifier} | @svar{boolean}
     74     | @svar{number} | @svar{character} | @svar{string}
     75     | @code{(} | @code{)} | @code{@hashchar{}(} | @code{@hashchar{}u8}
     76     | @code{'}
     77     | @code{`} | @code{,} | @code{,@@} | @code{.}
     78 
     79 @svar{delimiter} @expansion{} @svar{whitespace} | @svar{vertical line}
     80     | @code{(} | @code{)} | @code{"} | @code{;}
     81 
     82 @svar{intraline whitespace} @expansion{} @svar{space or tab}
     83 
     84 @svar{whitespace} @expansion{} @svar{intraline whitespace}
     85     | @svar{line ending}
     86 
     87 @svar{vertical line} @expansion{} @code{|}
     88 
     89 @svar{line ending} @expansion{} @svar{newline}
     90     | @svar{return} @svar{newline} | @svar{return}
     91 
     92 @svar{comment} @expansion{} @code{;}
     93       @pseudoprod{all subsequent characters up to a line ending}
     94     | @svar{nested comment}
     95     | @code{@hashchar{};} @svar{intertoken space} @svar{datum}
     96 
     97 @svar{nested comment} @expansion{}
     98       @code{@hashchar{}|} @svar{comment text}
     99         @arbno{@svar{comment cont}} @code{|@hashchar{}}
    100 
    101 @svar{comment text} @expansion{}
    102   @pseudoprod{character sequence not containing @code{@hashchar{}|}
    103               or @code{|@hashchar{}}}
    104 
    105 @svar{comment cont} @expansion{} @svar{nested comment}
    106     @svar{comment text}
    107 
    108 @svar{directive} @expansion{} @code{@hashchar{}!fold-case}
    109     | @code{@hashchar{}!no-fold-case}
    110 
    111 @end indentedblock
    112 
    113 Note that it is ungrammatical to follow a @svar{directive} with
    114 anything but a @svar{delimiter} or the end of file.
    115 
    116 @indentedblock
    117 
    118 @svar{atmosphere} @expansion{} @svar{whitespace} ∣ @svar{comment}
    119     ∣ @svar{directive}
    120 
    121 @svar{intertoken space} @expansion{} @arbno{@svar{atmosphere}}
    122 
    123 @end indentedblock
    124 
    125 Note that @code{+i}, @code{-i} and @svar{infnan} below are exceptions
    126 to the @svar{peculiar identifier} rule; they are parsed as numbers, not
    127 identifiers.
    128 
    129 @indentedblock
    130 
    131 @svar{identifier} @expansion{} @svar{initial} @arbno{@svar{subsequent}}
    132     | @svar{vertical line} @arbno{@svar{symbol element}}
    133         @svar{vertical line}
    134     | @svar{peculiar identifier}
    135 
    136 @svar{initial} @expansion{} @svar{letter} | @svar{special initial}
    137 
    138 @svar{letter} @expansion{} @code{a} | @code{b} | @code{c}
    139     | @dots{} | @code{z}
    140     | @code{A} | @code{B} | @code{C} | @dots{} | @code{Z}
    141 
    142 @svar{special initial} @expansion{} @code{!} | @code{$} | @code{%}
    143     | @code{&} | @code{*} | @code{/} | @code{:} | @code{<} | @code{=}
    144     | @code{>} | @code{?} | @code{^} | @code{_} | @code{~}
    145 
    146 @svar{subsequent} @expansion{} @svar{initial} | @svar{digit}
    147     | @svar{special subsequent}
    148 
    149 @svar{digit} @expansion{} @code{0} | @code{1} | @code{2} | @code{3}
    150     | @code{4} | @code{5} | @code{6} | @code{7} | @code{8} | @code{9}
    151 
    152 @svar{hex digit} @expansion{} @svar{digit} | @code{a} | @code{b}
    153     | @code{c} | @code{d} | @code{e} | @code{f}
    154 
    155 @svar{explicit sign} @expansion{} @code{+} | @code{-}
    156 
    157 @svar{special subsequent} @expansion{} @svar{explicit sign} | @code{.}
    158     | @code{@@}
    159 
    160 @svar{inline hex escape} @expansion{}
    161       @code{\x}@svar{hex scalar value}@code{;}
    162 
    163 @svar{hex scalar value} @expansion{} @atleastone{@svar{hex digit}}
    164 
    165 @svar{mnemonic escape} @expansion{} @code{\a} | @code{\b} | @code{\t}
    166     | @code{\n} | @code{\r}
    167 
    168 @svar{peculiar identifier} @expansion{} @svar{explicit sign}
    169     | @svar{explicit sign} @svar{sign subsequent}
    170         @arbno{@svar{subsequent}}
    171     | @svar{explicit sign} @code{.} @svar{dot subsequent}
    172       @arbno{@svar{subsequent}}
    173     | @code{.} @svar{dot subsequent} @arbno{@svar{subsequent}}
    174 
    175 @svar{dot subsequent} @expansion{} @svar{sign subsequent} | @code{.}
    176 
    177 @svar{sign subsequent} @expansion{} @svar{initial} | @svar{explicit sign}
    178     | @code{@@}
    179 
    180 @svar{symbol element} @expansion{}
    181     @pseudoprod{any character other than @svar{vertical line} or
    182                 @code{@backslashchar{}}}
    183     | @svar{inline hex escape} | @svar{mnemonic escape} | @code{|}
    184 
    185 @svar{boolean} @expansion{} @code{@hashchar{}t} | @code{@hashchar{}f}
    186     | @code{@hashchar{}true}
    187     | @code{@hashchar{}false}
    188 
    189 @svar{character} @expansion{} @hashchar{}\ @svar{any character}
    190     | @hashchar{}\ @svar{character name}
    191     | @hashchar{}\x@svar{hex scalar value}
    192 
    193 @svar{character name} @expansion{} @code{alarm} | @code{backspace}
    194    | @code{delete} | @code{escape} | @code{newline} | @code{null}
    195    | @code{return} | @code{space} | @code{tab}
    196 
    197 @svar{string} @expansion{} @code{"} @arbno{@svar{string element}} @code{"}
    198 
    199 @svar{string element} @expansion{}
    200       @pseudoprod{any character other than @code{"} or
    201                   @code{@backslashchar{}}}
    202     | @svar{mnemonic escape} | @code{\"} | @code{\\}
    203     | \@arbno{@svar{intraline whitespace}}@svar{line ending}
    204       @arbno{@svar{intraline whitespace}}
    205     | @svar{inline hex escape}
    206 
    207 @svar{bytevector} @expansion{} \@hashchar{}u8(@arbno{@svar{byte}})
    208 
    209 @svar{byte} @expansion{} @pseudoprod{any exact integer between 0 and 255}
    210 
    211 @end indentedblock
    212 
    213 The following rules for @svar{num R}, @svar{complex R}, @svar{real R},
    214 @svar{ureal R}, @svar{uinteger R}, and @svar{prefix R} are implicitly
    215 replicated for R = 2, 8, 10, and 16. There are no rules for
    216 @svar{decimal 2}, @svar{decimal 8}, and @svar{decimal 16}, which means
    217 that numbers containing decimal points or exponents are always in
    218 decimal radix. Although not shown below, all alphabetic characters used
    219 in the grammar of numbers can appear in either upper or lower case.
    220 
    221 @indentedblock
    222 
    223 @svar{num @var{R}} @expansion{} @svar{prefix @var{R}}
    224     @svar{complex @var{R}}
    225 
    226 @svar{complex @var{R}} @expansion{} @svar{real @var{R}}
    227     | @svar{real @var{R}} @code{@@} @svar{real @var{R}}
    228     | @svar{real @var{R}} @code{+} @svar{ureal @var{R}} @code{i}
    229     | @svar{real @var{R}} @code{-} @svar{ureal @var{R}} @code{i}
    230     | @svar{real @var{R}} @code{+ i}
    231     | @svar{real @var{R}} @code{- i}
    232     | @svar{real @var{R}} @svar{infnan} @code{i}
    233     | @code{+} @svar{ureal @var{R}} @code{i}
    234     | @code{-} @svar{ureal @var{R}} @code{i}
    235     | @svar{infnan} @code{i}
    236     | @code{+ i}
    237     | @code{- i}
    238 
    239 @svar{real @var{R}} @expansion{} @svar{sign} @svar{ureal @var{R}}
    240     | @svar{infnan}
    241 
    242 @svar{ureal @var{R}} @expansion{} @svar{uinteger @var{R}}
    243     | @svar{uinteger @var{R}} @code{/} @svar{uinteger @var{R}}
    244     | @svar{decimal @var{R}}
    245 
    246 @svar{decimal 10} @expansion{} @svar{uinteger 10} @svar{suffix}
    247     | @code{.} @atleastone{@svar{digit 10}} @svar{suffix}
    248     | @atleastone{@svar{digit 10}} @code{.} @arbno{@svar{digit 10}}
    249       @svar{suffix}
    250 
    251 @svar{uinteger @var{R}} @expansion{} @atleastone{@svar{digit @var{R}}}
    252 
    253 @svar{prefix @var{R}} @expansion{} @svar{radix @var{R}} @svar{exactness}
    254     | @svar{exactness} @svar{radix @var{R}}
    255 
    256 @svar{infnan} @expansion{} @code{+inf.0} | @code{-inf.0}
    257     | @code{+nan.0} | @code{-nan.0}
    258 
    259 @end indentedblock
    260 
    261 @sharpindex{b}
    262 @sharpindex{o}
    263 @sharpindex{x}
    264 @sharpindex{e}
    265 @sharpindex{i}
    266 
    267 @indentedblock
    268 
    269 @svar{suffix} @expansion{} @svar{empty}
    270     | @svar{exponent marker} @svar{sign} @atleastone{@svar{digit 10}}
    271 
    272 @svar{exponent marker} @expansion{} @code{e}
    273 
    274 @svar{sign} @expansion{} @svar{empty} | @code{+} | @code{-}
    275 
    276 @svar{exactness} @expansion{} @svar{empty} | @code{@hashchar{}i}
    277     | @code{@hashchar{}e}
    278 
    279 @svar{radix 2} @expansion{} @code{@hashchar{}b}
    280 
    281 @svar{radix 8} @expansion{} @code{@hashchar{}o}
    282 
    283 @svar{radix 10} @expansion{} @svar{empty} | @code{@hashchar{}d}
    284 
    285 @svar{radix 16} @expansion{} @code{@hashchar{}x}
    286 
    287 @svar{digit 2} @expansion{} @code{0} | @code{1}
    288 
    289 @svar{digit 8} @expansion{} @code{0} | @code{1} | @code{2} | @code{3}
    290     | @code{4} | @code{5} | @code{6} | @code{7}
    291 
    292 @svar{digit 10} @expansion{} @svar{digit}
    293 
    294 @svar{digit 16} @expansion{} @svar{digit 10} | @code{a} | @code{b}
    295     | @code{c} | @code{d} | @code{e} | @code{f}
    296 
    297 @end indentedblock
    298 
    299 @node External representations formal
    300 @subsection External representations
    301 
    302 @svar{Datum} is what the read procedure (@ref{Input}) successfully
    303 parses. Note that any string that parses as an @svar{expression} will
    304 also parse as a @svar{datum}.
    305 
    306 @indentedblock
    307 
    308 @svar{datum} @expansion{} @svar{simple datum} ∣ @svar{compound datum}
    309     ∣ @svar{label} @code{=} @svar{datum} ∣ @svar{label} @code{@hashchar{}}
    310 
    311 @svar{simple datum} @expansion{} @svar{boolean} ∣ @svar{number}
    312     ∣ @svar{character} ∣ @svar{string} ∣ @svar{symbol}
    313     ∣ @svar{bytevector}
    314 
    315 @svar{symbol} @expansion{} @svar{identifier}
    316 
    317 @svar{compound datum} @expansion{} @svar{list} ∣ @svar{vector}
    318     ∣ @svar{abbreviation}
    319 
    320 @svar{list} @expansion{} @code{(}@arbno{@svar{datum}}@code{)}
    321     ∣ @code{(}@atleastone{@svar{datum}} @code{.} @svar{datum}@code{)}
    322 
    323 @svar{abbreviation} @expansion{} @svar{abbrev prefix} @svar{datum}
    324 
    325 @svar{abbrev prefix} @expansion{} @code{'} ∣ @code{`} ∣ @code{,}
    326     ∣ @code{,@@}
    327 
    328 @svar{vector} @expansion{} @code{@hashchar{}(}@arbno{@svar{datum}}@code{)}
    329 
    330 @svar{label} @expansion{} @code{@hashchar{}} @svar{uinteger 10}
    331 
    332 @end indentedblock
    333 
    334 @node Expressions formal
    335 @subsection Expressions
    336 
    337 The definitions in this and the following subsections assume that all
    338 the syntax keywords defined in this report have been properly imported
    339 from their libraries, and that none of them have been redefined or
    340 shadowed.
    341 
    342 @indentedblock
    343 
    344 @svar{expression} @expansion{} @svar{identifier}@*
    345 @ @ | @svar{literal}@*
    346 @ @ | @svar{procedure call}@*
    347 @ @ | @svar{lambda expression}@*
    348 @ @ | @svar{conditional}@*
    349 @ @ | @svar{assignment}@*
    350 @ @ | @svar{derived expression}@*
    351 @ @ | @svar{macro use}@*
    352 @ @ | @svar{macro block}@*
    353 @ @ | @svar{includer}
    354 
    355 @sp 1
    356 
    357 @svar{literal} @expansion{} @svar{quotation} | @svar{self-evaluating}
    358 
    359 @svar{self-evaluating} @expansion{} @svar{boolean} | @svar{number}
    360     | @svar{vector} | @svar{character} | @svar{string} | @svar{bytevector}
    361 
    362 @svar{quotation} @expansion{} @code{'}@svar{datum}
    363     | @code{(quote} @svar{datum}@code{)}
    364 
    365 @svar{procedure call} @expansion{}
    366     @code{(}@svar{operator} @arbno{@svar{operand}}@code{)}
    367 
    368 @svar{operator} @expansion{} @svar{expression}
    369 
    370 @svar{operand} @expansion{} @svar{expression}
    371 
    372 @sp 1
    373 
    374 @svar{lambda expression} @expansion{}
    375     @code{(lambda} @svar{formals} @svar{body}@code{)}
    376 
    377 @svar{formals} @expansion{} @code{(}@arbno{@svar{identifier}}@code{)}
    378     | @svar{identifier}
    379     | @code{(}@atleastone{@svar{identifier}} @code{.}
    380         @svar{identifier}@code{)}
    381 
    382 @svar{body} @expansion{} @arbno{@svar{definition}} @svar{sequence}
    383 
    384 @svar{sequence} @expansion{} @arbno{@svar{command}} @svar{expression}
    385 
    386 @svar{command} @expansion{} @svar{expression}
    387 
    388 @sp 1
    389 
    390 @svar{conditional} @expansion{}
    391     @code{(if} @svar{test} @svar{consequent} @svar{alternate}@code{)}
    392 
    393 @svar{test} @expansion{} @svar{expression}
    394 
    395 @svar{consequent} @expansion{} @svar{expression}
    396 
    397 @svar{alternate} @expansion{} @svar{expression} | @svar{empty}
    398 
    399 @sp 1
    400 
    401 @svar{assignment} @expansion{}
    402     @code{(set!} @svar{identifier} @svar{expression}@code{)}
    403 
    404 @sp 1
    405 
    406 @c This is going to need some serious line-breaking.
    407 @svar{derived expression} @expansion{}
    408       @code{(cond }@atleastone{@svar{cond clause}}@code{)}@*
    409 @ @ | @code{(cond }@arbno{@svar{cond clause}} @code{(else}
    410         @svar{sequence})@code{)}@*
    411 @ @ | @code{(case }@svar{expression}
    412            @atleastone{@svar{case clause}}@code{)}@*
    413 @ @ | @code{(case }@svar{expression}
    414            @arbno{@svar{case clause}}
    415            @code{(else }@svar{sequence})@code{)}@*
    416 @ @ | @code{(case }@svar{expression}
    417            @arbno{@svar{case clause}}
    418            @code{(else =>} @svar{recipient})@code{)}@*
    419 @ @ | @code{(and }@arbno{@svar{test}}@code{)}@*
    420 @ @ | @code{(or }@arbno{@svar{test}}@code{)}@*
    421 @ @ | @code{(when }@svar{test} @svar{sequence}@code{)}@*
    422 @ @ | @code{(unless }@svar{test} @svar{sequence}@code{)}@*
    423 @ @ | @code{(let }(@arbno{@svar{binding spec}}) @svar{body}@code{)}@*
    424 @ @ | @code{(let }@svar{identifier} (@arbno{@svar{binding spec}})
    425         @svar{body}@code{)}@*
    426 @ @ | @code{(let* }(@arbno{@svar{binding spec}}) @svar{body}@code{)}@*
    427 @ @ | @code{(letrec }(@arbno{@svar{binding spec}}) @svar{body}@code{)}@*
    428 @ @ | @code{(letrec* }(@arbno{@svar{binding spec}}) @svar{body}@code{)}@*
    429 @ @ | @code{(let-values }(@arbno{@svar{mv binding spec}})
    430         @svar{body}@code{)}@*
    431 @ @ | @code{(let*-values }(@arbno{@svar{mv binding spec}})
    432         @svar{body}@code{)}@*
    433 @ @ | @code{(begin }@svar{sequence}@code{)}@*
    434 @ @ | @code{(do }(@arbno{@svar{iteration spec}}@code{)}
    435                (@svar{test} @svar{do result}@code{)}
    436            @arbno{@svar{command}}@code{)}@*
    437 @ @ | @code{(delay }@svar{expression}@code{)}@*
    438 @ @ | @code{(delay-force }@svar{expression}@code{)}@*
    439 @ @ | @code{(parameterize }(@arbno{(@svar{expression}
    440         @svar{expression})}@code{)} @svar{body}@code{)}@*
    441 @ @ | @code{(guard }(@svar{identifier} @arbno{@svar{cond clause}})
    442         @svar{body}@code{)}@*
    443 @ @ | @svar{quasiquotation}@*
    444 @ @ | @code{(case-lambda }@arbno{@svar{case-lambda clause}}@code{)}
    445 
    446 @sp 1
    447 
    448 @svar{cond clause} @expansion{} @code{(}@svar{test} @svar{sequence}@code{)}
    449     | @code{(}@svar{test}@code{)}
    450     | @code{(}@svar{test} @code{=>} @svar{recipient}@code{)}
    451 
    452 @svar{recipient} @expansion{} @svar{expression}
    453 
    454 @svar{case clause} @expansion{}
    455       @code{((}@arbno{@svar{datum}}@code{)} @svar{sequence}@code{)}
    456     | @code{((}@arbno{@svar{datum}}@code{) =>} @svar{recipient}@code{)}
    457 
    458 @svar{binding spec} @expansion{} @code{(}@svar{identifier}
    459       @svar{expression}@code{)}
    460 
    461 @svar{mv binding spec} @expansion{} @code{(}@svar{formals}
    462       @svar{expression}@code{)}
    463 
    464 @svar{iteration spec} @expansion{} @code{(}@svar{identifier} @svar{init}
    465      @svar{step}@code{)}
    466    | @code{(}@svar{identifier} @svar{init}@code{)}
    467 
    468 @svar{case-lambda clause} @expansion{} @code{(}@svar{formals}
    469      @svar{body}@code{)}
    470 
    471 @svar{init} @expansion{} @svar{expression}
    472 
    473 @svar{step} @expansion{} @svar{expression}
    474 
    475 @svar{do result} @expansion{} @svar{sequence} | @svar{empty}
    476 
    477 @sp 1
    478 
    479 @svar{macro use} @expansion{} @code{(}@svar{keyword}
    480       @arbno{@svar{datum}}@code{)}
    481 
    482 @svar{keyword} @expansion{} @svar{identifier}
    483 
    484 @svar{macro block} @expansion{}
    485       @code{@code{(}let-syntax }@code{(}@arbno{@svar{syntax spec}}@code{)}
    486         @svar{body}@code{)}
    487     | @code{(letrec-syntax }@code{(}@arbno{@svar{syntax spec}}@code{)}
    488         @svar{body}@code{)}
    489 
    490 @svar{syntax spec} @expansion{} @code{(}@svar{keyword}
    491       @svar{transformer spec}@code{)}
    492 
    493 @sp 1
    494 
    495 @svar{includer} @expansion{}
    496    | @code{(include }@atleastone{@svar{string}}@code{)}
    497    | @code{(include-ci }@atleastone{@svar{string}}@code{)}
    498 
    499 @end indentedblock
    500 
    501 @node Quasiquotations
    502 @subsection Quasiquotations
    503 
    504 The following grammar for quasiquote expressions is not context-free.
    505 It is presented as a recipe for generating an infinite number of
    506 production rules. Imagine a copy of the following rules for @var{D} =
    507 1, 2, 3, @dots{}, where @var{D} is the nesting depth.
    508 
    509 @indentedblock
    510 @svar{quasiquotation} @expansion{} @svar{quasiquotation 1}
    511 
    512 @svar{qq template 0} @expansion{} @svar{expression}
    513 
    514 @svar{quasiquotation @var{D}} @expansion{}
    515       @code{`}@svar{qq template @var{D}}
    516     | @code{(quasiquote }@svar{qq template @var{D}}@code{)}
    517 
    518 @svar{qq template @var{D}} @expansion{} @svar{simple datum}
    519     | @svar{list qq template @var{D}}
    520     | @svar{vector qq template @var{D}}
    521     | @svar{unquotation @var{D}}
    522 
    523 @svar{list qq template @var{D}} @expansion{}
    524       @code{(}@arbno{@svar{qq template or splice @var{D}}}@code{)}
    525     | @code{(}@atleastone{@svar{qq template or splice @var{D}}} @code{.}
    526         @svar{qq template @var{D}}@code{)}
    527     | @code{'}@svar{qq template @var{D}}
    528     | @svar{quasiquotation @var{D}+1}
    529 
    530 @svar{vector qq template @var{D}} @expansion{}
    531       @code{@hashchar{}(}@arbno{@svar{qq template or
    532         splice @var{D}}}@code{)}
    533 
    534 @svar{unquotation @var{D}} @expansion{}
    535       @code{,}@svar{qq template @var{D}@minus{}1}
    536     | @code{(unquote }@svar{qq template @var{D}@minus{}1}@code{)}
    537 
    538 @svar{qq template or splice @var{D}} @expansion{}
    539       @svar{qq template @var{D}}
    540     | @svar{splicing unquotation @var{D}}
    541 
    542 @svar{splicing unquotation @var{D}} @expansion{}
    543       @code{,@@}@svar{qq template @var{D}@minus{}1}
    544     | @code{(unquote-splicing }@svar{qq template @var{D}@minus{}1})
    545 
    546 @end indentedblock
    547 
    548 In @svar{quasiquotation}s, a @svar{list qq template @var{D}} can
    549 sometimes be confused with either an @svar{unquotation @var{D}} or a
    550 @svar{splicing unquotation @var{D}}.
    551 
    552 The interpretation as an @svar{unquotation} or
    553 @svar{splicing unquotation @var{D}} takes precedence.
    554 
    555 @node Transformers
    556 @subsection Transformers
    557 
    558 Note: Though this grammar does not say so, a top-level
    559 @code{syntax-rules} pattern must be a list pattern, not a vector
    560 pattern or an identifier pattern.
    561 
    562 @indentedblock
    563 
    564 @svar{transformer spec} @expansion{}
    565       @code{(syntax-rules }(@arbno{@svar{identifier}}@code{)}
    566         @arbno{@svar{syntax rule}}@code{)}
    567     | @code{(syntax-rules }@svar{identifier}
    568         @code{(}@arbno{@svar{identifier}}@code{)}
    569         @arbno{@svar{syntax rule}}@code{)}
    570 
    571 @svar{syntax rule} @expansion{}
    572       @code{(}@svar{pattern} @svar{template}@code{)}
    573 
    574 @svar{pattern} @expansion{} @svar{pattern identifier}@*
    575 @ @ | @svar{underscore}@*
    576 @ @ | @code{(}@arbno{@svar{pattern}}@code{)}@*
    577 @ @ | @code{(}@atleastone{@svar{pattern}} @code{.} @svar{pattern}@code{)}@*
    578 @ @ | @code{(}@arbno{@svar{pattern}} @svar{pattern} @svar{ellipsis}
    579         @arbno{@svar{pattern}}@code{)}@*
    580 @ @ | @code{(}@arbno{@svar{pattern}} @svar{pattern} @svar{ellipsis}
    581         @arbno{@svar{pattern}} @code{.} @svar{pattern}@code{)}@*
    582 @ @ | @code{@hashchar{}(}@arbno{@svar{pattern}}@code{)}@*
    583 @ @ | @code{@hashchar{}(}@arbno{@svar{pattern}} @svar{pattern}
    584         @svar{ellipsis} @arbno{@svar{pattern}}@code{)}@*
    585 @ @ | @svar{pattern datum}
    586 
    587 @svar{pattern datum} @expansion{} @svar{string}
    588     | @svar{character}
    589     | @svar{boolean}
    590     | @svar{number}
    591     | @svar{bytevector}
    592 
    593 @svar{template} @expansion{} @svar{pattern identifier}
    594     | @code{(}@arbno{@svar{template element}}@code{)}
    595     | @code{(}@atleastone{@svar{template element}} @code{.}
    596         @svar{template}@code{)}
    597     | @code{@hashchar{}(}@arbno{@svar{template element}}@code{)}
    598     | @svar{template datum}
    599 
    600 @svar{template element} @expansion{} @svar{template}
    601     | @svar{template} @svar{ellipsis}
    602 
    603 @svar{template datum} @expansion{} @svar{pattern datum}
    604 
    605 @c Don't use @dots{} for the ellipsis identifier; this will emit an
    606 @c ellipsis character in most output formats, which is wrong here.
    607 @svar{pattern identifier} @expansion{}
    608       @svar{any identifier except @code{...}}
    609 
    610 @svar{ellipsis} @expansion{} @svar{an identifier defaulting to @code{...}}
    611 
    612 @svar{underscore} @expansion{} @svar{the identifier @code{_}}
    613 
    614 @end indentedblock
    615 
    616 @node Programs and definitions
    617 @subsection Programs and definitions
    618 
    619 @indentedblock
    620 
    621 @svar{program} @expansion{}
    622    @atleastone{@svar{import declaration}}
    623    @atleastone{@svar{command or definition}}
    624 
    625 @svar{command or definition} @expansion{} @svar{command}
    626     | @svar{definition}
    627     | @code{(begin }@atleastone{@svar{command or definition}}@code{)}
    628 
    629 @svar{definition} @expansion{}
    630       @code{(define }@svar{identifier} @svar{expression}@code{)}@*
    631 @ @ | @code{(define }(@svar{identifier} @svar{def formals}@code{)}
    632         @svar{body}@code{)}@*
    633 @ @ | @svar{syntax definition}@*
    634 @ @ | @code{(define-values }@svar{formals} @svar{body}@code{)}@*
    635 @ @ | @code{(define-record-type }@svar{identifier}
    636         @svar{constructor} @svar{identifier}
    637         @arbno{@svar{field spec}}@code{)}@*
    638 @ @ | @code{(begin }@arbno{@svar{definition}}@code{)}
    639 
    640 @svar{def formals} @expansion{} @arbno{@svar{identifier}}
    641     | @arbno{@svar{identifier}} @code{.} @svar{identifier}
    642 
    643 @svar{constructor} @expansion{}
    644       @code{(}@svar{identifier} @arbno{@svar{field name}}@code{)}
    645 
    646 @svar{field spec} @expansion{}
    647       @code{(}@svar{field name} @svar{accessor}@code{)}
    648     | @code{(}@svar{field name} @svar{accessor} @svar{mutator}@code{)}
    649 
    650 @svar{field name} @expansion{} @svar{identifier}
    651 
    652 @svar{accessor} @expansion{} @svar{identifier}
    653 
    654 @svar{mutator} @expansion{} @svar{identifier}
    655 
    656 @svar{syntax definition} @expansion{}
    657     @code{(define-syntax }@svar{keyword} @svar{transformer spec}@code{)}
    658 
    659 @end indentedblock
    660 
    661 @node Libraries formal
    662 @subsection Libraries
    663 
    664 @indentedblock
    665 
    666 @svar{library} @expansion{}
    667       @code{(define-library }@svar{library name}
    668         @arbno{@svar{library declaration}}@code{)}
    669 
    670 @svar{library name} @expansion{}
    671       @code{(}@atleastone{@svar{library name part}}@code{)}
    672 
    673 @svar{library name part} @expansion{} @svar{identifier}
    674     | @svar{uinteger 10}
    675 
    676 @svar{library declaration} @expansion{}
    677       @code{(export }@arbno{@svar{export spec}}@code{)}@*
    678 @ @   | @svar{import declaration}@*
    679 @ @   | @code{(begin }@arbno{@svar{command or definition}}@code{)}@*
    680 @ @   | @svar{includer}@*
    681 @ @   | @code{(include-library-declarations}
    682           @atleastone{@svar{string}}@code{)}@*
    683 @ @   | @code{(cond-expand}
    684           @atleastone{@svar{cond-expand clause}}@code{)}@*
    685 @ @   | @code{(cond-expand}
    686           @atleastone{@svar{cond-expand clause}}
    687           @code{(else }@arbno{@svar{library declaration}})@code{)}
    688 
    689 @svar{import declaration} @expansion{}
    690       @code{(import }@atleastone{@svar{import set}}@code{)}
    691 
    692 @svar{export spec} @expansion{} @svar{identifier}
    693    | @code{(rename }@svar{identifier} @svar{identifier}@code{)}
    694 
    695 @svar{import set} @expansion{} @svar{library name}@*
    696 @ @ | @code{(only }@svar{import set}
    697        @atleastone{@svar{identifier}}@code{)}@*
    698 @ @ | @code{(except }@svar{import set}
    699        @atleastone{@svar{identifier}}@code{)}@*
    700 @ @ | @code{(prefix }@svar{import set} @svar{identifier}@code{)}@*
    701 @ @ | @code{(rename }@svar{import set}
    702        @atleastone{(@svar{identifier} @svar{identifier})}@code{)}
    703 
    704 @svar{cond-expand clause} @expansion{}
    705    (@svar{feature requirement} @arbno{@svar{library declaration}}@code{)}
    706 
    707 @svar{feature requirement} @expansion{} @svar{identifier}
    708 @ @ | @code{(library }@svar{library name}@code{)}@*
    709 @ @ | @code{(and }@arbno{@svar{feature requirement}}@code{)}@*
    710 @ @ | @code{(or }@arbno{@svar{feature requirement}}@code{)}@*
    711 @ @ | @code{(not }@svar{feature requirement}@code{)}
    712 
    713 @end indentedblock