Each symbol has four components (or “cells”), each of which references another object:
symbol-namein Creating Symbols.
symbol-valuein Accessing Variables.
symbol-functionin Function Cells.
symbol-plistin Property Lists.
The print name cell always holds a string, and cannot be changed. The other three cells can be set individually to any specified Lisp object.
The print name cell holds the string that is the name of the symbol. Since symbols are represented textually by their names, it is important not to have two symbols with the same name. The Lisp reader ensures this: every time it reads a symbol, it looks for an existing symbol with the specified name before it creates a new one. (In GNU Emacs Lisp, this lookup uses a hashing algorithm and an obarray; see Creating Symbols.)
The value cell holds the symbol's value as a variable
(see Variables). That is what you get if you evaluate the symbol as
a Lisp expression (see Evaluation). Any Lisp object is a legitimate
value. Certain symbols have values that cannot be changed; these
t, and any symbol whose name starts with
‘:’ (those are called keywords). See Constant Variables.
We often refer to “the function
foo” when we really mean
the function stored in the function cell of the symbol
make the distinction explicit only when necessary. In normal
usage, the function cell usually contains a function
(see Functions) or a macro (see Macros), as that is what the
Lisp interpreter expects to see there (see Evaluation). Keyboard
macros (see Keyboard Macros), keymaps (see Keymaps) and
autoload objects (see Autoloading) are also sometimes stored in
the function cells of symbols.
The property list cell normally should hold a correctly formatted property list (see Property Lists), as a number of functions expect to see a property list there.
The function cell or the value cell may be void, which means
that the cell does not reference any object. (This is not the same
thing as holding the symbol
void, nor the same as holding the
nil.) Examining a function or value cell that is void
results in an error, such as ‘Symbol's value as variable is void’.
The four functions
symbol-function return the contents of
the four cells of a symbol. Here as an example we show the contents of
the four cells of the symbol
(symbol-name 'buffer-file-name) ⇒ "buffer-file-name" (symbol-value 'buffer-file-name) ⇒ "/gnu/elisp/symbols.texi" (symbol-function 'buffer-file-name) ⇒ #<subr buffer-file-name> (symbol-plist 'buffer-file-name) ⇒ (variable-documentation 29529)
Because this symbol is the variable which holds the name of the file
being visited in the current buffer, the value cell contents we see are
the name of the source file of this chapter of the Emacs Lisp Manual.
The property list cell contains the list
29529) which tells the documentation functions where to find the
documentation string for the variable
buffer-file-name in the
DOC-version file. (29529 is the offset from the beginning
of the DOC-version file to where that documentation string
begins—see Documentation Basics.) The function cell contains
the function for returning the name of the file.
buffer-file-name names a primitive function, which has no read
syntax and prints in hash notation (see Primitive Function Type). A
symbol naming a function written in Lisp would have a lambda expression
(or a byte-code object) in this cell.