Skip to main content

12.2 Variables that Never Change

In Emacs Lisp, certain symbols normally evaluate to themselves. These include nil and t, as well as any symbol whose name starts with β€˜:’ (these are called keywords). These symbols cannot be rebound, nor can their values be changed. Any attempt to set or bind nil or t signals a setting-constant error. The same is true for a keyword (a symbol whose name starts with β€˜:’), if it is interned in the standard obarray, except that setting such a symbol to itself is not an error.

nil ≑ 'nil
β‡’ nil
(setq nil 500)
error→ Attempt to set constant symbol: nil

function keywordp object​

function returns t if object is a symbol whose name starts with β€˜:’, interned in the standard obarray, and returns nil otherwise.

These constants are fundamentally different from the constants defined using the defconst special form (see Defining Variables). A defconst form serves to inform human readers that you do not intend to change the value of a variable, but Emacs does not raise an error if you actually change it.

A small number of additional symbols are made read-only for various practical reasons. These include enable-multibyte-characters, most-positive-fixnum, most-negative-fixnum, and a few others. Any attempt to set or bind these also signals a setting-constant error.