Traditional Scheme has only a few kinds of values, and thus only a few builtin kinds of literals. Modern Scheme allows defining new types, so it is desirable to have a mechanism for defining literal values for the new types.
Consider the URI
type.
You can create a new instance of a URI
using a
constructor function:
(URI "http://example.com/")
This isn’t too bad, though the double-quote characters are an ugly distraction. However, if you need to construct the string it gets messy:
(URI (string-append base-uri "icon.png"))
Instead use can write:
&URI{http://example.com/}
or:
&URI{&[base-uri]icon.png}
This syntax is translated by the Scheme reader to the more familiar but more verbose equivalent forms:
($construct$:URI "http://example.com/") ($construct$:URI $<<$ base-uri $>>$ "icon.png")
So for this to work there just needs to be a definition
of $construct$:URI
, usually a macro.
Normal scope rules apply; typically you’d define $construct$:URI
in
a module.
The names $<<$
and $>>$
are bound to unique zero-length strings.
They are used to allow the implementation of $construct$:URI
to determine which arguments are literal and which come from
escaped expressions.
If you want to define your own $construct$:
,
or to read motivation and details, see the
SRFI 108 specification.
tag
extended-datum-literal
::=
&
cname
{
[initial-ignored
] named-literal-part
* }
| &
cname
[
expression
* ]{
[initial-ignored
] named-literal-part
* }
cname
::=
identifier
named-literal-part
::=
any character except &
, {
or }
| {
named-literal-part
+ }
| char-ref
| entity-ref
| special-escape
| enclosed-part
| extended-datum-literal