A symbol is an object with a unique name. This chapter describes symbols, their components, their property lists, and how they are created and interned. Separate chapters describe the use of symbols as variables and as function names; see Variables, and Functions. For the precise read syntax for symbols, see Symbol Type.
You can test whether an arbitrary Lisp object is a symbol with
symbolp:
This function returns t if object is a symbol, nil
otherwise.
Each symbol has four components (or “cells”), each of which references another object:
The symbol’s name.
The symbol’s current value as a variable.
The symbol’s function definition. It can also hold a symbol, a keymap, or a keyboard macro.
The symbol’s property list.
The print name cell always holds a string, and cannot be changed. Each of the other three cells can be set to any Lisp object.
The print name cell holds the string that is the name of a 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. To get a
symbol’s name, use the function symbol-name (see Creating and Interning Symbols). However, although each symbol has only one unique
print name, it is nevertheless possible to refer to that same
symbol via different alias names called “shorthands”
(see Shorthands).
The value cell holds a symbol’s value as a variable, which is what
you get if the symbol itself is evaluated as a Lisp expression.
See Variables, for details about how values are set and retrieved,
including complications such as local bindings and scoping
rules. Most symbols can have any Lisp object as a value, but certain
special symbols have values that cannot be changed; these include
nil and t, and any symbol whose name starts with
‘:’ (those are called keywords). See Variables that Never Change.
The function cell holds a symbol’s function definition. Often, we
refer to “the function foo” when we really mean the function
stored in the function cell of foo; we make the distinction
explicit only when necessary. Typically, the function cell is used to
hold a function (see Functions) or a macro (see Macros).
However, it can also be used to hold a symbol (see Symbol Function Indirection), keyboard macro (see Keyboard Macros), keymap
(see Keymaps), or autoload object (see Autoloading). To get
the contents of a symbol’s function cell, use the function
symbol-function (see Accessing Function Cell Contents).
The property list cell normally should hold a correctly formatted
property list. To get a symbol’s property list, use the function
symbol-plist. See Symbol Properties.
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 symbol nil.) Examining
a value cell that is void results in an error, such as ‘Symbol's
value as variable is void’.
Because each symbol has separate value and function cells, the names
of variables and functions do not conflict. For example, the symbol
buffer-file-name has a value (the name of the file being visited
in the current buffer) as well as a function definition (a primitive
function that returns the name of the file):
buffer-file-name
⇒ "/gnu/elisp/symbols.texi"
(symbol-function 'buffer-file-name)
⇒ #<subr buffer-file-name>
A definition is a special kind of Lisp expression that announces your intention to use a symbol in a particular way. It typically specifies a value or meaning for the symbol for one kind of use, plus documentation for its meaning when used in this way. Thus, when you define a symbol as a variable, you can supply an initial value for the variable, plus documentation for the variable.
defvar and defconst are special forms that define a
symbol as a global variable—a variable that can be accessed at
any point in a Lisp program. See Variables, for details about
variables. To define a customizable variable, use the
defcustom macro, which also calls defvar as a subroutine
(see Customization Settings).
In principle, you can assign a variable value to any symbol with
setq, whether or not it has first been defined as a variable.
However, you ought to write a variable definition for each global
variable that you want to use; otherwise, your Lisp program may not
act correctly if it is evaluated with lexical scoping enabled
(see Scoping Rules for Variable Bindings).
defun defines a symbol as a function, creating a lambda
expression and storing it in the function cell of the symbol. This
lambda expression thus becomes the function definition of the symbol.
(The term “function definition”, meaning the contents of the function
cell, is derived from the idea that defun gives the symbol its
definition as a function.) defsubst and defalias are two
other ways of defining a function. See Functions.
defmacro defines a symbol as a macro. It creates a macro
object and stores it in the function cell of the symbol. Note that a
given symbol can be a macro or a function, but not both at once, because
both macro and function definitions are kept in the function cell, and
that cell can hold only one Lisp object at any given time.
See Macros.
As previously noted, Emacs Lisp allows the same symbol to be defined
both as a variable (e.g., with defvar) and as a function or
macro (e.g., with defun). Such definitions do not conflict.
These definitions also act as guides for programming tools. For example, the C-h f and C-h v commands create help buffers containing links to the relevant variable, function, or macro definitions. See Name Help in The GNU Emacs Manual.
To understand how symbols are created in GNU Emacs Lisp, you must know how Lisp reads them. Lisp must ensure that it finds the same symbol every time it reads the same sequence of characters in the same context. Failure to do so would cause complete confusion.
When the Lisp reader encounters a name that references a symbol in the source code, it looks up that name in a table called an obarray to find the symbol that the programmer meant. An obarray is an unordered container of symbols, indexed by name.
The Lisp reader also considers “shorthands”. If the programmer supplied them, this allows the reader to find a symbol even if its name isn’t present in its full form in the source code. See Shorthands.
If a symbol with the desired name is found, the reader uses that symbol. If the obarray does not contain a symbol with that name, the reader makes a new symbol and adds it to the obarray. Finding or adding a symbol with a certain name is called interning it, and the symbol is then called an interned symbol.
Interning ensures that each obarray has just one symbol with any particular name. Other like-named symbols may exist, but not in the same obarray. Thus, the reader gets the same symbols for the same names, as long as you keep reading with the same obarray.
Interning usually happens automatically in the reader, but sometimes other programs may want to do it. For example, after the M-x command obtains the command name as a string using the minibuffer, it then interns the string, to get the interned symbol with that name. As another example, a hypothetical telephone book program could intern the name of each looked up person’s name as a symbol, even if the obarray did not contain it, so that it could attach information to that new symbol, such as the last time someone looked it up.
No obarray contains all symbols; in fact, some symbols are not in any obarray. They are called uninterned symbols. An uninterned symbol has the same four cells as other symbols; however, the only way to gain access to it is by finding it in some other object or as the value of a variable. Uninterned symbols are sometimes useful in generating Lisp code, see below.
Common Lisp note: Unlike Common Lisp, Emacs Lisp does not provide for interning the same name in several different “packages”, thus creating multiple symbols with the same name but different packages. Emacs Lisp provides a different namespacing system called “shorthands” (see Shorthands).
This function creates and returns a new obarray. The optional size may be used to specify the number of symbols that it is expected to hold, but since obarrays grow automatically as needed, this rarely provides any benefit.
This function returns t if object is an obarray,
nil otherwise.
Most of the functions below take a name and sometimes an obarray as
arguments. A wrong-type-argument error is signaled if the name
is not a string, or if the obarray is not an obarray object.
This function returns the string that is symbol’s name. For example:
(symbol-name 'foo)
⇒ "foo"
Warning: Never alter the string returned by that function. Doing that might make Emacs dysfunctional, and might even crash Emacs.
Creating an uninterned symbol is useful in generating Lisp code, because an uninterned symbol used as a variable in the code you generate cannot clash with any variables used in other Lisp programs.
This function returns a newly-allocated, uninterned symbol whose name is
name (which must be a string). Its value and function definition
are void, and its property list is nil. In the example below,
the value of sym is not eq to foo because it is a
distinct uninterned symbol whose name is also ‘foo’.
(setq sym (make-symbol "foo"))
⇒ foo
(eq sym 'foo)
⇒ nil
This function returns a symbol using make-symbol, whose name is
made by appending gensym-counter to prefix and incrementing
that counter, guaranteeing that no two calls to this function will
generate a symbol with the same name. The prefix defaults to
"g".
To avoid problems when accidentally interning printed representation
of generated code (see Printed Representation and Read Syntax), it is recommended
to use gensym instead of make-symbol.
This function returns the interned symbol whose name is name. If
there is no such symbol in the obarray obarray, intern
creates a new one, adds it to the obarray, and returns it. If
obarray is omitted, the value of the global variable
obarray is used.
(setq sym (intern "foo"))
⇒ foo
(eq sym 'foo)
⇒ t
(setq sym1 (intern "foo" other-obarray))
⇒ foo
(eq sym1 'foo)
⇒ nil
Common Lisp note: In Common Lisp, you can intern an existing symbol in an obarray. In Emacs Lisp, you cannot do this, because the argument to
internmust be a string, not a symbol.
This function returns the symbol in obarray whose name is
name, or nil if obarray has no symbol with that name.
Therefore, you can use intern-soft to test whether a symbol with
a given name is already interned. If obarray is omitted, the
value of the global variable obarray is used.
The argument name may also be a symbol; in that case,
the function returns name if name is interned
in the specified obarray, and otherwise nil.
(intern-soft "frazzle") ; No such symbol exists. ⇒ nil (make-symbol "frazzle") ; Create an uninterned one. ⇒ frazzle
(intern-soft "frazzle") ; That one cannot be found.
⇒ nil
(setq sym (intern "frazzle")) ; Create an interned one.
⇒ frazzle
(intern-soft "frazzle") ; That one can be found!
⇒ frazzle
(eq sym 'frazzle) ; And it is the same one.
⇒ t
This variable is the standard obarray for use by intern and
read.
This function calls function once with each symbol in the obarray
obarray. Then it returns nil. If obarray is
omitted, it defaults to the value of obarray, the standard
obarray for ordinary symbols.
(setq count 0)
⇒ 0
(defun count-syms (s)
(setq count (1+ count)))
⇒ count-syms
(mapatoms 'count-syms)
⇒ nil
count
⇒ 1871
See documentation in Access to Documentation Strings, for another
example using mapatoms.
This function deletes symbol from the obarray obarray. If
symbol is not actually in the obarray, unintern does
nothing. If obarray is nil, the current obarray is used.
If you provide a string instead of a symbol as symbol, it stands
for a symbol name. Then unintern deletes the symbol (if any) in
the obarray which has that name. If there is no such symbol,
unintern does nothing.
If unintern does delete a symbol, it returns t. Otherwise
it returns nil.
This function removes all symbols from obarray.
A symbol may possess any number of symbol properties, which
can be used to record miscellaneous information about the symbol. For
example, when a symbol has a risky-local-variable property with
a non-nil value, that means the variable which the symbol names
is a risky file-local variable (see File Local Variables).
Each symbol’s properties and property values are stored in the symbol’s property list cell (see Symbol Components), in the form of a property list (see Property Lists).
The following functions can be used to access symbol properties.
This function returns the value of the property named property
in symbol’s property list. If there is no such property, it
returns nil. Thus, there is no distinction between a value of
nil and the absence of the property.
The name property is compared with the existing property names
using eq, so any object is a legitimate property.
See put for an example.
This function puts value onto symbol’s property list under
the property name property, replacing any previous property value.
The put function returns value.
(put 'fly 'verb 'transitive)
⇒'transitive
(put 'fly 'noun '(a buzzing little bug))
⇒ (a buzzing little bug)
(get 'fly 'verb)
⇒ transitive
(symbol-plist 'fly)
⇒ (verb transitive noun (a buzzing little bug))
This function returns the property list of symbol.
This function sets symbol’s property list to plist. Normally, plist should be a well-formed property list, but this is not enforced. The return value is plist.
(setplist 'foo '(a 1 b (2 3) c nil))
⇒ (a 1 b (2 3) c nil)
(symbol-plist 'foo)
⇒ (a 1 b (2 3) c nil)
For symbols in special obarrays, which are not used for ordinary purposes, it may make sense to use the property list cell in a nonstandard fashion; in fact, the abbrev mechanism does so (see Abbrevs and Abbrev Expansion).
You could define put in terms of setplist and
plist-put, as follows:
(defun put (symbol prop value)
(setplist symbol
(plist-put (symbol-plist symbol) prop value)))
This function is identical to get, except that if symbol
is the name of a function alias, it looks in the property list of the
symbol naming the actual function. See Defining Functions. If the
optional argument autoload is non-nil, and symbol
is auto-loaded, this function will try to autoload it, since
autoloading might set property of symbol. If
autoload is the symbol macro, only try autoloading if
symbol is an auto-loaded macro.
This function sets property of function to value.
function should be a symbol. This function is preferred to
calling put for setting properties of a function, because it
will allow us some day to implement remapping of old properties to new
ones.
Here, we list the symbol properties which are used for special purposes in Emacs. In the following table, whenever we say “the named function”, that means the function whose name is the relevant symbol; similarly for “the named variable” etc.
:advertised-bindingThis property value specifies the preferred key binding, when showing documentation, for the named function. See Substituting Key Bindings in Documentation.
char-table-extra-slotsThe value, if non-nil, specifies the number of extra slots in
the named char-table type. See Char-Tables.
customized-faceface-defface-specsaved-facetheme-faceThese properties are used to record a face’s standard, saved,
customized, and themed face specs. Do not set them directly; they are
managed by defface and related functions. See Defining Faces.
customized-valuesaved-valuestandard-valuetheme-valueThese properties are used to record a customizable variable’s standard
value, saved value, customized-but-unsaved value, and themed values.
Do not set them directly; they are managed by defcustom and
related functions. See Defining Customization Variables.
definition-namefind-function-type-alistThese properties help find the definition of a symbol in the source code when it might be hard to find the definition by textual search of the source file, as when the symbol is defined by a macro. See Finding Definitions.
disabledIf the value is non-nil, the named function is disabled as a
command. See Disabling Commands.
face-documentationThe value stores the documentation string of the named face. This is
set automatically by defface. See Defining Faces.
history-lengthThe value, if non-nil, specifies the maximum minibuffer history
length for the named history list variable. See Minibuffer History.
important-return-value ¶A non-nil value makes the byte compiler warn about code that
calls the named function without using its returned value. This is
useful for functions where doing so is likely to be a mistake.
This property is normally added to a function with declare
(see The declare Form).
interactive-formThe value is an interactive form for the named function. Normally,
you should not set this directly; use the interactive special
form instead. See Using interactive.
interactive-onlyIf the value is non-nil, the named function should not be called
from Lisp. The value is an error string or the function to call
instead. See Defining Commands.
menu-aliasIf non-nil, this symbol is an alias menu entry, and its own key binding should not be shown. See Alias Menu Items.
menu-enableThe value is an expression for determining whether the named menu item should be enabled in menus. See Simple Menu Items.
mode-classIf the value is special, the named major mode is special.
See Major Mode Conventions.
ignored-mouse-commandmouse-1-menu-commandThese properties affect how commands bound to down-mouse-1 behave.
See Touchscreen Events.
permanent-localIf the value is non-nil, the named variable is a buffer-local
variable whose value should not be reset when changing major modes.
See Creating and Deleting Buffer-Local Bindings.
permanent-local-hookIf the value is non-nil, the named function should not be
deleted from the local value of a hook variable when changing major
modes. See Setting Hooks.
pure ¶If the value is non-nil, the named function is considered to be
pure (see What Is a Function?). Calls with constant arguments can
be evaluated at compile time. This may shift run time errors to
compile time. This property is normally added to a function with
declare (see The declare Form).
risky-local-variableIf the value is non-nil, the named variable is considered risky
as a file-local variable. See File Local Variables.
safe-function ¶If the value is non-nil, the named function is considered
generally safe for evaluation. See Determining whether a Function is Safe to Call.
safe-local-eval-functionIf the value is non-nil, the named function is safe to call in
file-local evaluation forms. See File Local Variables.
safe-local-variableThe value specifies a function for determining safe file-local values for the named variable. See File Local Variables.
side-effect-free ¶A non-nil value indicates that the named function is free of
side effects (see What Is a Function?), so the byte compiler may
ignore a call whose value is unused. If the property’s value is
error-free, the byte compiler may even delete such unused
calls. In addition to byte compiler optimizations, this property is
also used for determining function safety (see Determining whether a Function is Safe to Call).
This property is normally added to a function with
declare (see The declare Form).
undo-inhibit-regionIf non-nil, the named function prevents the undo operation
from being restricted to the active region, if undo is invoked
immediately after the function. See Undo.
variable-documentationIf non-nil, this specifies the named variable’s documentation
string. This is set automatically by defvar and related
functions. See Documentation Basics.
The symbol shorthands, sometimes known as “renamed symbols”, are symbolic forms found in Lisp source. They’re just like regular symbolic forms, except that when the Lisp reader encounters them, it produces symbols which have a different and usually longer print name (see Symbol Components).
It is useful to think of shorthands as abbreviating the full names of intended symbols. Despite this, do not confuse shorthands with the Abbrev system (see Abbrevs and Abbrev Expansion).
Shorthands make Emacs Lisp’s namespacing etiquette easier to work
with. Since all symbols are stored in a single obarray
(see Creating and Interning Symbols), programmers commonly prefix each symbol
name with the name of the library where it originates. For example,
the functions text-property-search-forward and
text-property-search-backward both belong to the
text-property-search.el library (see Loading). By properly
prefixing symbol names, one effectively prevents clashes between
similarly named symbols which belong to different libraries and thus do
different things. However, this practice commonly originates very
long symbols names, which are inconvenient to type and read after a
while. Shorthands solve these issues in a clean way.
This variable’s value is an alist whose elements have the form
(shorthand-prefix . longhand-prefix). Each element
instructs the Lisp reader to read every symbol form which starts with
shorthand-prefix as if it started with longhand-prefix
instead.
This variable may only be set in file-local variables (see Local Variables in Files in The GNU Emacs Manual).
Here’s an example of shorthands usage in a hypothetical string manipulating library some-nice-string-utils.el.
(defun some-nice-string-utils-split (separator s &optional omit-nulls) "A match-data saving variant of `split-string'." (save-match-data (split-string s separator omit-nulls))) (defun some-nice-string-utils-lines (s) "Split string S at newline characters into a list of strings." (some-nice-string-utils-split "\\(\r\n\\|[\n\r]\\)" s))
As can be seen, it’s quite tedious to read or develop this code since the symbol names to type are so long. We can use shorthands to alleviate that.
(defun snu-split (separator s &optional omit-nulls)
"A match-data saving variation on `split-string'."
(save-match-data (split-string s separator omit-nulls)))
(defun snu-lines (s)
"Split string S into a list of strings on newline characters."
(snu-split "\\(\r\n\\|[\n\r]\\)" s))
;; Local Variables:
;; read-symbol-shorthands: (("snu-" . "some-nice-string-utils-"))
;; End:
Even though the two excerpts look different, they are quite identical
after the Lisp reader processes them. Both will lead to the very same
symbols being interned (see Creating and Interning Symbols). Thus loading or
byte-compiling any of the two files has equivalent results. The
shorthands snu-split and snu-lines used in the second
version are not interned in the obarray. This is easily seen
by moving point to the location where the shorthands are used and
waiting for ElDoc (see Local Variables
in Files in The GNU Emacs Manual) to hint at the true full name
of the symbol under point in the echo area.
Since read-symbol-shorthands is a file-local variable, it is
possible that multiple libraries depending on
some-nice-string-utils-lines.el refer to the same symbols under
different shorthands, or not using shorthands at all. In the
next example, the my-tricks.el library refers to the symbol
some-nice-string-utils-lines using the sns- prefix
instead of snu-.
(defun t-reverse-lines (s) (string-join (reverse (sns-lines s)) "\n")
;; Local Variables:
;; read-symbol-shorthands: (("t-" . "my-tricks-")
;; ("sns-" . "some-nice-string-utils-"))
;; End:
Note that if you have two shorthands in the same file where one is the prefix of the other, the longer shorthand will be attempted first. This happens regardless of the order you specify shorthands in the local variables section of your file.
'(
t//foo ; reads to 'my-tricks--foo', not 'my-tricks-/foo'
t/foo ; reads to 'my-tricks-foo'
)
;; Local Variables:
;; read-symbol-shorthands: (("t/" . "my-tricks-")
;; ("t//" . "my-tricks--"))
;; End:
There are two exceptions to rules governing Shorthand transformations:
- or /= as shorthand
prefixes, but that won’t shadow the arithmetic functions of
those names.
A symbol with position is a symbol, called the bare symbol, together with a nonnegative fixnum called the position. Even though a symbol with position often acts like its bare symbol, it is not a symbol: instead, it is an object that has both a bare symbol and a position. Because symbols with position are not symbols, they don’t have entries in the obarray, though their bare symbols typically do (see Creating and Interning Symbols).
The byte compiler uses symbols with position,
records in them the position of each symbol occurrence, and uses those
positions in warning and error messages. They shouldn’t normally be
used otherwise. Doing so can cause unexpected results with basic
Emacs functions such as eq and equal.
The printed representation of a symbol with position uses the hash
notation outlined in Printed Representation and Read Syntax. It looks like
‘#<symbol foo at 12345>’. It has no read syntax. You can cause
just the bare symbol to be printed by binding the variable
print-symbols-bare to non-nil around the print
operation. The byte compiler does this before writing its output to
the compiled Lisp file.
When the flag variable symbols-with-pos-enabled is non-nil,
a symbol with position ordinarily behaves like its bare symbol.
For example, ‘(eq (position-symbol 'foo 12345) 'foo)’ yields t,
and equal likewise treats a symbol with position as its bare symbol.
When symbols-with-pos-enabled is nil, symbols with
position behave as themselves, not as symbols. For example, ‘(eq
(position-symbol 'foo 12345) 'foo)’ yields nil, and equal
likewise treats a symbol with position as not equal to its bare symbol.
Most of the time in Emacs symbols-with-pos-enabled is
nil, but the byte compiler and the native compiler bind it to
t when they run and Emacs runs a little more slowly in this case.
Typically, symbols with position are created by the byte compiler
calling the reader function read-positioning-symbols
(see Input Functions). One can also be created with the function
position-symbol.
This variable affects the behavior of symbols with position when they
are not being printed and are not arguments to one of the functions
defined later in this section. When this variable is non-nil,
such a symbol with position behaves like its bare symbol; otherwise it
behaves as itself, not as a symbol.
When bound to non-nil, the Lisp printer prints only the bare
symbol of a symbol with position, ignoring the position.
Otherwise a symbol with position prints as itself, not as a symbol.
This function returns t if object is a symbol with
position, nil otherwise.
Unlike symbolp, this function ignores symbols-with-pos-enabled.
This function returns the bare symbol of the symbol with
position sym, or sym itself if it is already a symbol.
For any other type of object, it signals an error.
This function ignores symbols-with-pos-enabled.
This function returns the position, a nonnegative fixnum, from the symbol with
position sympos. For any other type of object, it signals an error.
This function ignores symbols-with-pos-enabled.
Make a new symbol with position. The new object’s bare symbol is taken
from sym, which is either a symbol, or a symbol with position
whose bare symbol is used. The new object’s position is taken from
pos, which is either a nonnegative fixnum, or a symbol with
position whose position is used.
Emacs signals an error if either argument is invalid.
This function ignores symbols-with-pos-enabled.