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).
The following words are interpreted as keywords:
abstract
adapt
addr
alias
and
as
auto
base
break
case
choice
class
constraint
continue
default
destructor
else
export
extend
final
fn
for
forall
friend
if
impl
impls
import
in
interface
let
library
like
match
namespace
not
observe
or
override
package
partial
private
protected
require
return
returned
Self
template
then
type
var
virtual
where
while
A word starting with i
, u
, or f
, followed by a decimal integer, is a
numeric type literal.
A word is interpreted as an identifier if it is neither a keyword nor a type literal.
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.
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
- Proposal #142: Unicode source files
- Proposal #2015: Numeric type literal syntax
- Proposal #3797: Raw identifier syntax