The datum syntax describes the syntax of syntactic data in terms of a
sequence of lexeme
s, as defined in the lexical syntax.
The following grammar describes the syntax of syntactic data in terms of various kinds of lexemes defined in the grammar in section “Lexical Syntax”:
datum
::=
defining-datum
| nondefining-datum
| defined-datum
nondefining-datum
::=
lexeme-datum
| compound-datum
lexeme-datum
::=
boolean
| number
| character
| string
| symbol
symbol
::=
identifier
compound-datum
::=
list
| vector
| uniform-vector
| array-literal
| extended-string-literal
| xml-literal
list
::=
(
datum
*)
| (
datum
+ .
datum
)
| abbreviation
vector
::=
#(
datum
*)
datum-label
::=
#
indexnum
=
defining-datum
::=
datum-label
+nondefining-datum
defined-datum
::=
#
indexnum
#
indexnum
::=
digit
+
The lexical syntax #
reads the
same as n
=datum
datum
, but also results in datum
being
labelled by n
, which must a sequence of digits.
The lexical syntax #
serves as a reference to some
object labelled by n
##
; the result is the same object
(in the sense of n
=eq?
) as the #
.
n
=
Together, these syntaxes permit the notation of structures with shared or circular substructure.
(let ((x (list 'a 'b 'c))) (set-cdr! (cddr x) x) x) ⇒ #0=(a b c . #0#)
The scope of a datum label is the portion of the outermost
datum in which it appears that is to the right of the label.
Consequently, a reference #
can occur
only after a label n
##
;
it is an error to attempt a forward reference.
In addition, it is an error if the reference appears as the labelled
object itself (as in n
=#
), because the object
labelled by n
=#n
##
is not well defined in this case.
n
=
abbreviation
::=
r6rs-abbreviation
| kawa-abbreviation
r6rs-abbreviation
::=
abbrev-prefix
datum
abbrev-prefix
::=
’
| ‘
| ,
| ,@
| #’
| #‘
kawa-abbreviation
::=
XXX
The following abbreviations are expanded at read-time:
’
datum
means (quote
datum
)
.
‘
datum
means (quasiquote
datum
)
.
,
datum
means (unquote
datum
)
.
,@
datum
means (unquote-splicing
datum
)
.
#’
datum
means (syntax
datum
)
.
#‘
datum
means (quasisyntax
datum
)
.
#,
datum
means (unsyntax
datum
)
.
This abbreviation is currently only recognized when nested inside an explicit
#‘
datum
form,
because of a conflict with SRFI-10 named constructors.
#,@
datum
means (unsyntax-splicing
datum
)
.
datum1
:
datum2
means ($lookup$
datum1
(quasiquote
datum2
))
.
See Colon notation.
[
expression
...]
means ($bracket-list$
expression
...)
.
operator
[
expression
...]
means ($bracket-apply$
operator
expression
...)
.