データ構文は構文データの構文を、字句構文で定義された語彙素の並びを使って説明する。
構文データには前節で述べた語彙素データと、複合データを構成するための次の構成要素を含む。
次の文法は 4.2 節の文法で定義された種々の語彙素についての構文データの構文について説明している。
<datum> → <lexeme datum> | <compound datum> <lexeme datum> → <boolean> | <number> | <character> | <string> | <symbol> <symbol> → <identifier> <compound datum> → <list> | <vector> | <bytevector> <list> → (<datum>*) | [<datum>*] | (<datum>+ . <datum>) | [<datum>+ . <datum>] | <abbreviation> <abbreviation> → <abbrev prefix> <datum> <abbrev prefix> → ’ | ‘ | , | ,@ | #’ | #‘ | #, | #,@ <vector> → #(<datum>*) <bytevector> → #vu8(<u8>*) <u8> → <{0, ..., 255} の範囲の正確な整数を表現する任意の <number>>
リストデータと対データは、値の対とリストを表し(R6RS:翻訳:R6RS:11.9 Pairs and lists 参照)、丸括弧と角括弧を使って表される。 <list> の規則に現れる対応の取れた角括弧の組は対応の取れた丸括弧の組と等価である。
Scheme の対の最も一般的な表記法は「ドット」記法である。 (<datum1> . <datum2>)。ここで、 <datum1> は car フィールドの値の表現であり、 <datum2> は cdr フィールドの値の表現である。例えば、 (4 . 5) は car が 4 で cdr が 5 の対である。
リストにはより合理的な記法を使うことができる。リストの要素は単純に括弧で囲まれて空白で区切られる。空リストは () で表現される。例えば、
(a b c d e)
と
(a . (b . (c . (d . (e . ())))))
はシンボルのリストの等価な表記である。
一般則はこうである。ドットに開き括弧が続いていた場合、ドットと開き括弧と、対応する閉じ括弧は外部表現では省略することができる。
「(4 . 5)」という文字の並びは対の外部表現であり、対に評価される式ではない。同様に、「(+ 2 6)」という文字の並びは、((rnrs base (6)) ライブラリの言語で)整数 8 に評価される式であるが、整数 8 の外部表現ではない。正しくは、 3 要素のリストを表現する構文データであり、その要素がシンボル + と 整数 2 と 6 であるものである。
ベクタデータは、オブジェクトのベクタを表現し(R6RS:翻訳:R6RS:11.13 Vectors 参照) #(<datum> ...) という記法を使って表される。例えば、長さ 3 のベクタで、0 要素目に 0 にあたるオブジェクトを格納し、 1 番目にリスト (2 2 2 2) を格納し、2 番目に文字列 "Anna" を格納したものは次のように表現される。
#(0 (2 2 2 2) "Anna")
これはベクタの外部表現であり、ベクタに評価される式ではない。
バイトベクタデータは、バイトベクタを表現し(R6RS:翻訳:Standard Libraries:2 Bytevectors 参照)、 #vu8(<u8> ...) という表記法を使って表現される。ここで、 <u8> はバイトベクタのオクテットを表現するものである。例えば、長さ 3 のバイトベクタで、オクテット 2、 24、 123 を格納したものは次のように表される。
#vu8(2 24 123)
これはバイトベクタの外部表現であり、また、バイトベクタに評価される式でもある。
これらのそれぞれは以下の略記法である。
(quote <datum>)
(quasiquote <datum>)
(unquote <datum>)
(unquote-splicing <datum>)
(syntax <datum>)
(quasisyntax <datum>)
(unsyntax <datum>)
(unsyntax-splicing <datum>)