# Words
# Table of contents
# Overview
A word is a lexical element formed from a sequence of letters or letter-like
characters, such as fn or Foo or Int, optionally preceded by r#.
The exact lexical form of words has not yet been settled. However, Carbon will follow lexical conventions for identifiers based on Unicode Annex #31. TODO: Update this once the precise rules are decided; see the Unicode source files proposal.
Carbon source files, including comments and string literals, are required to be in Unicode Normalization Form C (NFC).
# Keywords
The following words are interpreted as keywords:
abstractadaptaliasandasautobasebreakCorecasechoiceclassconstraintcontinuedefaultdestroyelseexportextendfinalfnforforallfriendifimplimplsimportininterfaceletlibrarylikematchnamespacenotobserveoroverridepackagepartialprivateprotectedrefrequirereturnreturnedSelfselftemplatethentypevarvirtualwherewhile
# Type literals
A word starting with i, u, or f, followed by a decimal integer, is a
_numeric type literal_.
# Identifiers
A word is interpreted as an identifier if it is neither a keyword nor a type literal.
# Raw identifiers
A raw identifier is a word starting with r#. A raw identifier is equivalent
to the word following the r# prefix, except that it is always interpreted as
an identifier, even if it would otherwise be a keyword or type literal.
Raw identifiers can be used to specify identifiers which have the same spelling
as keywords; for example, r#impl. This can be useful when interoperating with
C++ code that uses identifiers that are keywords in Carbon, and when migrating
between versions of Carbon.
The word doesn't need to be a keyword, in order to support forwards
compatibility when a keyword is planned to be added. If word is an identifier,
then word and r#word have the same meaning.
# Alternatives considered
Overview:
Type literals:
- Use C++ type keywords with LP64 convention
- Use full type name with length suffix
- Use uppercase for type names
- Support additional bit widths
Raw identifiers:
- Other raw identifier syntaxes
- Restrict raw identifier syntax to current and future keywords
- Don't require syntax for references to raw identifiers
- Don't provide raw identifier syntax
# References
- Proposal #142: Unicode source files
- Proposal #2015: Numeric type literal syntax
- Proposal #3797: Raw identifier syntax