An identifier is any sequence of letters, digits, and extended identifier characters provided that it does not have a prefix which is a valid number. However, the ‘.’ token (a single period) used in the list syntax is not an identifier.
All implementations of Scheme must support the following extended identifier characters:
!$%&*+-./:<=>?@^_~
Alternatively, an identifier can be represented by a sequence of zero or more characters enclosed within vertical lines (‘|’), analogous to string literals. Any character, including whitespace characters, but excluding the backslash and vertical line characters, can appear verbatim in such an identifier. In addition, characters can be specified using either an ⟨inline hex escape⟩ or the same escapes available in strings.
For example, the identifier |H\x65;llo| is the same identifier as
Hello, and in an implementation that supports the appropriate
Unicode character the identifier |\x3BB;| is the same as the
identifier λ. What is more, |\t\t| and
|\x9;\x9;| are the same. Note that || is a valid identifier
that is different from any other identifier.
Here are some examples of identifiers:
...++soup+<=?.>stringa34kTMNslambdalist->vectorqV17a|two words||two\x20;words|the-word-recursion-has-many-meanings
For the formal syntax of identifiers, see Lexical structure.
Identifiers have two uses within Scheme programs:
In contrast with earlier revisions of the report23, the syntax distinguishes between upper and lower case in identifiers and in characters specified using their names. However, it does not distinguish between upper and lower case in numbers, nor in ⟨inline hex escapes⟩ used in the syntax of identifiers, characters, or strings. None of the identifiers defined in this report contain upper-case characters, even when they appear to do so as a result of the English-language convention of capitalizing the first word of a sentence.
The following directives give explicit control over case folding.
#!fold-case
#!no-fold-case
These directives can appear anywhere comments are permitted
(see Whitespace and comments) but must be followed by a delimiter.
They are treated as comments, except that they affect the reading of
subsequent data from the same port. The #!fold-case directive
causes subsequent identifiers and character names to be case-folded as
if by string-foldcase (see Strings). It has no effect on
character literals. The #!no-fold-case directive causes a return
to the default, non-folding behavior.
Richard Kelsey, William Clinger, and Jonathan Rees, editors. Revised 5 Report on the Algorithmic Language Scheme. Higher-Order and Symbolic Computation, Vol. 11, No. 1, August 1998.