## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Identifiers

An identifier is an ASCII character sequence that:

- Starts with a letter (`a-z`, `A-Z`) or underscore (`_`)
- Can contain any number of:
  - Letters (`a-z`, `A-Z`)
  - Digits (`0-9`)
  - Underscores (`_`)
  - Apostrophes (`'`)
  - Hyphens (`-`)
- Is not one of the keywords

> Syntax

> identifier ~ `[A-Za-z_][A-Za-z0-9_'-]*`

# Names

A name can be written as an identifier or a string literal.

> Syntax

> name → identifier | string

Names are used in attribute sets, `let` bindings, and `inherit`. Two names are the same if they represent the same sequence of characters, regardless of whether they are written as identifiers or strings.

# Keywords

These keywords are reserved and cannot be used as identifiers:

- `assert`
- `else`
- `if`
- `in`
- `inherit`
- `let`
- `or` (see note)
- `rec`
- `then`
- `with`

> Note

> The Nix language evaluator currently allows `or` to be used as a name in some contexts, for backwards compatibility reasons. Users are advised not to rely on this.

> There are long-standing issues with how `or` is parsed as a name, which can't be resolved without making a breaking change to the language.