The printed representation of a char-table is like a vector
except that there is an extra ‘#^’ at the beginning.1
Case tables (see The Case Table).
Character category tables (see Categories).
Display tables (see Display Tables).
Syntax tables (see Syntax Tables).
2.4.11 Bool-Vector Type
A bool-vector is a one-dimensional array whose elements must
be t
or nil
.
The printed representation of a bool-vector is like a string, except
that it begins with ‘#&’ followed by the length. The string
constant that follows actually specifies the contents of the bool-vector
as a bitmap—each character in the string contains 8 bits, which
specify the next 8 elements of the bool-vector (1 stands for t
,
and 0 for nil
). The least significant bits of the character
correspond to the lowest indices in the bool-vector.
(make-bool-vector 3 t)
⇒ #&3"^G"
(make-bool-vector 3 nil)
⇒ #&3"^@"
These results make sense, because the binary code for ‘C-g’ is
111 and ‘C-@’ is the character with code 0.
If the length is not a multiple of 8, the printed representation
shows extra elements, but these extras really make no difference. For
instance, in the next example, the two bool-vectors are equal, because
only the first 3 bits are used:
(equal #&3"\377" #&3"\007")
⇒ t
2.4.12 Hash Table Type
A hash table is a very fast kind of lookup table, somewhat like an
alist in that it maps keys to corresponding values, but much faster.
The printed representation of a hash table specifies its properties
and contents, like this:
(make-hash-table)
⇒ #s(hash-table size 65 test eql rehash-size 1.5
rehash-threshold 0.8125 data ())
See Hash Tables, for more information about hash tables.
2.4.13 Function Type
Lisp functions are executable code, just like functions in other
programming languages. In Lisp, unlike most languages, functions are
also Lisp objects. A non-compiled function in Lisp is a lambda
expression: that is, a list whose first element is the symbol
lambda
(see Lambda Expressions).
In most programming languages, it is impossible to have a function
without a name. In Lisp, a function has no intrinsic name. A lambda
expression can be called as a function even though it has no name; to
emphasize this, we also call it an anonymous function
(see Anonymous Functions). A named function in Lisp is just a
symbol with a valid function in its function cell (see Defining Functions).
Most of the time, functions are called when their names are written in
Lisp expressions in Lisp programs. However, you can construct or obtain
a function object at run time and then call it with the primitive
functions funcall
and apply
. See Calling Functions.
2.4.14 Macro Type
A Lisp macro is a user-defined construct that extends the Lisp
language. It is represented as an object much like a function, but with
different argument-passing semantics. A Lisp macro has the form of a
list whose first element is the symbol macro
and whose CDR
is a Lisp function object, including the lambda
symbol.
Lisp macro objects are usually defined with the built-in
defmacro
macro, but any list that begins with macro
is a
macro as far as Emacs is concerned. See Macros, for an explanation
of how to write a macro.
Warning: Lisp macros and keyboard macros (see Keyboard Macros) are entirely different things. When we use the word “macro”
without qualification, we mean a Lisp macro, not a keyboard macro.
2.4.15 Primitive Function Type
A primitive function is a function callable from Lisp but
written in the C programming language. Primitive functions are also
called subrs or built-in functions. (The word “subr” is
derived from “subroutine”.) Most primitive functions evaluate all
their arguments when they are called. A primitive function that does
not evaluate all its arguments is called a special form
(see Special Forms).
It does not matter to the caller of a function whether the function is
primitive. However, this does matter if you try to redefine a primitive
with a function written in Lisp. The reason is that the primitive
function may be called directly from C code. Calls to the redefined
function from Lisp will use the new definition, but calls from C code
may still use the built-in definition. Therefore, we discourage
redefinition of primitive functions.
The term function refers to all Emacs functions, whether written
in Lisp or C. See Function Type, for information about the
functions written in Lisp.
Primitive functions have no read syntax and print in hash notation
with the name of the subroutine.
(symbol-function 'car) ; Access the function cell
; of the symbol.
⇒ #<subr car>
(subrp (symbol-function 'car)) ; Is this a primitive function?
⇒ t ; Yes.
2.4.16 Byte-Code Function Type
Byte-code function objects are produced by byte-compiling Lisp
code (see Byte Compilation). Internally, a byte-code function
object is much like a vector; however, the evaluator handles this data
type specially when it appears in a function call. See Byte-Code Function Objects.
The printed representation and read syntax for a byte-code function
object is like that for a vector, with an additional ‘#’ before the
opening ‘[’.
2.4.17 Record Type
A record is much like a vector
. However, the first
element is used to hold its type as returned by type-of
. The
purpose of records is to allow programmers to create objects with new
types that are not built into Emacs.
See Records, for functions that work with records.
2.4.18 Type Descriptors
A type descriptor is a record
which holds information
about a type. Slot 1 in the record must be a symbol naming the type, and
type-of
relies on this to return the type of record
objects. No other type descriptor slot is used by Emacs; they are
free for use by Lisp extensions.
An example of a type descriptor is any instance of
cl-structure-class
.
2.4.19 Autoload Type
An autoload object is a list whose first element is the symbol
autoload
. It is stored as the function definition of a symbol,
where it serves as a placeholder for the real definition. The autoload
object says that the real definition is found in a file of Lisp code
that should be loaded when necessary. It contains the name of the file,
plus some other information about the real definition.
After the file has been loaded, the symbol should have a new function
definition that is not an autoload object. The new definition is then
called as if it had been there to begin with. From the user’s point of
view, the function call works as expected, using the function definition
in the loaded file.
An autoload object is usually created with the function
autoload
, which stores the object in the function cell of a
symbol. See Autoload, for more details.
2.4.20 Finalizer Type
A finalizer object helps Lisp code clean up after objects that
are no longer needed. A finalizer holds a Lisp function object.
When a finalizer object becomes unreachable after a garbage collection
pass, Emacs calls the finalizer’s associated function object.
When deciding whether a finalizer is reachable, Emacs does not count
references from finalizer objects themselves, allowing you to use
finalizers without having to worry about accidentally capturing
references to finalized objects themselves.
Errors in finalizers are printed to *Messages*
. Emacs runs
a given finalizer object’s associated function exactly once, even
if that function fails.
- Function: make-finalizer function ¶
Make a finalizer that will run function. function will be
called after garbage collection when the returned finalizer object
becomes unreachable. If the finalizer object is reachable only
through references from finalizer objects, it does not count as
reachable for the purpose of deciding whether to run function.
function will be run once per finalizer object.
2.5 Editing Types
The types in the previous section are used for general programming
purposes, and most of them are common to most Lisp dialects. Emacs Lisp
provides several additional data types for purposes connected with
editing.
2.5.1 Buffer Type
A buffer is an object that holds text that can be edited
(see Buffers). Most buffers hold the contents of a disk file
(see Files) so they can be edited, but some are used for other
purposes. Most buffers are also meant to be seen by the user, and
therefore displayed, at some time, in a window (see Windows). But
a buffer need not be displayed in any window. Each buffer has a
designated position called point (see Positions); most
editing commands act on the contents of the current buffer in the
neighborhood of point. At any time, one buffer is the current
buffer.
The contents of a buffer are much like a string, but buffers are not
used like strings in Emacs Lisp, and the available operations are
different. For example, you can insert text efficiently into an
existing buffer, altering the buffer’s contents, whereas inserting
text into a string requires concatenating substrings, and the result
is an entirely new string object.
Many of the standard Emacs functions manipulate or test the
characters in the current buffer; a whole chapter in this manual is
devoted to describing these functions (see Text).
Several other data structures are associated with each buffer:
The local keymap and variable list contain entries that individually
override global bindings or values. These are used to customize the
behavior of programs in different buffers, without actually changing the
programs.
A buffer may be indirect, which means it shares the text
of another buffer, but presents it differently. See Indirect Buffers.
Buffers have no read syntax. They print in hash notation, showing the
buffer name.
(current-buffer)
⇒ #<buffer objects.texi>
2.5.2 Marker Type
A marker denotes a position in a specific buffer. Markers
therefore have two components: one for the buffer, and one for the
position. Changes in the buffer’s text automatically relocate the
position value as necessary to ensure that the marker always points
between the same two characters in the buffer.
Markers have no read syntax. They print in hash notation, giving the
current character position and the name of the buffer.
(point-marker)
⇒ #<marker at 10779 in objects.texi>
See Markers, for information on how to test, create, copy, and move
markers.
2.5.3 Window Type
A window describes the portion of the screen that Emacs uses to
display buffers. Every live window (see Basic Concepts of Emacs Windows) has one
associated buffer, whose contents appear in that window. By contrast, a
given buffer may appear in one window, no window, or several windows.
Windows are grouped on the screen into frames; each window belongs to
one and only one frame. See Frame Type.
Though many windows may exist simultaneously, at any time one window
is designated the selected window (see Selecting Windows).
This is the window where the cursor is (usually) displayed when Emacs is
ready for a command. The selected window usually displays the current
buffer (see The Current Buffer), but this is not necessarily the case.
Windows have no read syntax. They print in hash notation, giving the
window number and the name of the buffer being displayed. The window
numbers exist to identify windows uniquely, since the buffer displayed
in any given window can change frequently.
(selected-window)
⇒ #<window 1 on objects.texi>
See Windows, for a description of the functions that work on windows.
2.5.4 Frame Type
A frame is a screen area that contains one or more Emacs
windows; we also use the term “frame” to refer to the Lisp object
that Emacs uses to refer to the screen area.
Frames have no read syntax. They print in hash notation, giving the
frame’s title, plus its address in core (useful to identify the frame
uniquely).
(selected-frame)
⇒ #<frame emacs@psilocin.gnu.org 0xdac80>
See Frames, for a description of the functions that work on frames.
2.5.5 Terminal Type
A terminal is a device capable of displaying one or more
Emacs frames (see Frame Type).
Terminals have no read syntax. They print in hash notation giving
the terminal’s ordinal number and its TTY device file name.
(get-device-terminal nil)
⇒ #<terminal 1 on /dev/tty>
2.5.6 Window Configuration Type
A window configuration stores information about the positions,
sizes, and contents of the windows in a frame, so you can recreate the
same arrangement of windows later.
Window configurations do not have a read syntax; their print syntax
looks like ‘#<window-configuration>’. See Window Configurations, for a description of several functions related to
window configurations.
2.5.7 Frame Configuration Type
A frame configuration stores information about the positions,
sizes, and contents of the windows in all frames. It is not a
primitive type—it is actually a list whose CAR is
frame-configuration
and whose CDR is an alist. Each alist
element describes one frame, which appears as the CAR of that
element.
See Frame Configurations, for a description of several functions
related to frame configurations.
2.5.8 Process Type
The word process usually means a running program. Emacs itself
runs in a process of this sort. However, in Emacs Lisp, a process is a
Lisp object that designates a subprocess created by the Emacs process.
Programs such as shells, GDB, ftp, and compilers, running in
subprocesses of Emacs, extend the capabilities of Emacs.
An Emacs subprocess takes textual input from Emacs and returns textual
output to Emacs for further manipulation. Emacs can also send signals
to the subprocess.
Process objects have no read syntax. They print in hash notation,
giving the name of the process:
(process-list)
⇒ (#<process shell>)
See Processes, for information about functions that create, delete,
return information about, send input or signals to, and receive output
from processes.
2.5.9 Thread Type
A thread in Emacs represents a separate thread of Emacs Lisp
execution. It runs its own Lisp program, has its own current buffer,
and can have subprocesses locked to it, i.e. subprocesses whose
output only this thread can accept. See Threads.
Thread objects have no read syntax. They print in hash notation,
giving the name of the thread (if it has been given a name) or its
address in core:
(all-threads)
⇒ (#<thread 0176fc40>)
2.5.10 Mutex Type
A mutex is an exclusive lock that threads can own and disown,
in order to synchronize between them. See Mutexes.
Mutex objects have no read syntax. They print in hash notation,
giving the name of the mutex (if it has been given a name) or its
address in core:
(make-mutex "my-mutex")
⇒ #<mutex my-mutex>
(make-mutex)
⇒ #<mutex 01c7e4e0>
2.5.11 Condition Variable Type
A condition variable is a device for a more complex thread
synchronization than the one supported by a mutex. A thread can wait
on a condition variable, to be woken up when some other thread
notifies the condition.
Condition variable objects have no read syntax. They print in hash
notation, giving the name of the condition variable (if it has been
given a name) or its address in core:
(make-condition-variable (make-mutex))
⇒ #<condvar 01c45ae8>
2.5.12 Stream Type
A stream is an object that can be used as a source or sink for
characters—either to supply characters for input or to accept them as
output. Many different types can be used this way: markers, buffers,
strings, and functions. Most often, input streams (character sources)
obtain characters from the keyboard, a buffer, or a file, and output
streams (character sinks) send characters to a buffer, such as a
*Help* buffer, or to the echo area.
The object nil
, in addition to its other meanings, may be used
as a stream. It stands for the value of the variable
standard-input
or standard-output
. Also, the object
t
as a stream specifies input using the minibuffer
(see Minibuffers) or output in the echo area (see The Echo Area).
Streams have no special printed representation or read syntax, and
print as whatever primitive type they are.
See Reading and Printing Lisp Objects, for a description of functions
related to streams, including parsing and printing functions.
2.5.13 Keymap Type
A keymap maps keys typed by the user to commands. This mapping
controls how the user’s command input is executed. A keymap is actually
a list whose CAR is the symbol keymap
.
See Keymaps, for information about creating keymaps, handling prefix
keys, local as well as global keymaps, and changing key bindings.
2.5.14 Overlay Type
An overlay specifies properties that apply to a part of a
buffer. Each overlay applies to a specified range of the buffer, and
contains a property list (a list whose elements are alternating property
names and values). Overlay properties are used to present parts of the
buffer temporarily in a different display style. Overlays have no read
syntax, and print in hash notation, giving the buffer name and range of
positions.
See Overlays, for information on how you can create and use overlays.
2.5.15 Font Type
A font specifies how to display text on a graphical terminal.
There are actually three separate font types—font objects,
font specs, and font entities—each of which has slightly
different properties. None of them have a read syntax; their print
syntax looks like ‘#<font-object>’, ‘#<font-spec>’, and
‘#<font-entity>’ respectively. See Low-Level Font Representation, for a
description of these Lisp objects.
2.6 Read Syntax for Circular Objects
To represent shared or circular structures within a complex of Lisp
objects, you can use the reader constructs ‘#n=’ and
‘#n#’.
Use #n=
before an object to label it for later reference;
subsequently, you can use #n#
to refer the same object in
another place. Here, n is some integer. For example, here is how
to make a list in which the first element recurs as the third element:
This differs from ordinary syntax such as this
which would result in a list whose first and third elements
look alike but are not the same Lisp object. This shows the difference:
(prog1 nil
(setq x '(#1=(a) b #1#)))
(eq (nth 0 x) (nth 2 x))
⇒ t
(setq x '((a) b (a)))
(eq (nth 0 x) (nth 2 x))
⇒ nil
You can also use the same syntax to make a circular structure, which
appears as an element within itself. Here is an example:
This makes a list whose second element is the list itself.
Here’s how you can see that it really works:
(prog1 nil
(setq x '#1=(a #1#)))
(eq x (cadr x))
⇒ t
The Lisp printer can produce this syntax to record circular and shared
structure in a Lisp object, if you bind the variable print-circle
to a non-nil
value. See Variables Affecting Output.
2.7 Type Predicates
The Emacs Lisp interpreter itself does not perform type checking on
the actual arguments passed to functions when they are called. It could
not do so, since function arguments in Lisp do not have declared data
types, as they do in other programming languages. It is therefore up to
the individual function to test whether each actual argument belongs to
a type that the function can use.
All built-in functions do check the types of their actual arguments
when appropriate, and signal a wrong-type-argument
error if an
argument is of the wrong type. For example, here is what happens if you
pass an argument to +
that it cannot handle:
(+ 2 'a)
error→ Wrong type argument: number-or-marker-p, a
If you want your program to handle different types differently, you
must do explicit type checking. The most common way to check the type
of an object is to call a type predicate function. Emacs has a
type predicate for each type, as well as some predicates for
combinations of types.
A type predicate function takes one argument; it returns t
if
the argument belongs to the appropriate type, and nil
otherwise.
Following a general Lisp convention for predicate functions, most type
predicates’ names end with ‘p’.
Here is an example which uses the predicates listp
to check for
a list and symbolp
to check for a symbol.
(defun add-on (x)
(cond ((symbolp x)
;; If X is a symbol, put it on LIST.
(setq list (cons x list)))
((listp x)
;; If X is a list, add its elements to LIST.
(setq list (append x list)))
(t
;; We handle only symbols and lists.
(error "Invalid argument %s in add-on" x))))
Here is a table of predefined type predicates, in alphabetical order,
with references to further information.
atom
See atom.
arrayp
See arrayp.
bignump
See floatp.
bool-vector-p
See bool-vector-p.
booleanp
See booleanp.
bufferp
See bufferp.
byte-code-function-p
See byte-code-function-p.
compiled-function-p
See compiled-function-p.
case-table-p
See case-table-p.
char-or-string-p
See char-or-string-p.
char-table-p
See char-table-p.
commandp
See commandp.
condition-variable-p
See condition-variable-p.
consp
See consp.
custom-variable-p
See custom-variable-p.
fixnump
See floatp.
floatp
See floatp.
fontp
See Low-Level Font Representation.
frame-configuration-p
See frame-configuration-p.
frame-live-p
See frame-live-p.
framep
See framep.
functionp
See functionp.
hash-table-p
See hash-table-p.
integer-or-marker-p
See integer-or-marker-p.
integerp
See integerp.
keymapp
See keymapp.
keywordp
See Variables that Never Change.
listp
See listp.
markerp
See markerp.
mutexp
See mutexp.
nlistp
See nlistp.
number-or-marker-p
See number-or-marker-p.
numberp
See numberp.
overlayp
See overlayp.
processp
See processp.
recordp
See recordp.
sequencep
See sequencep.
string-or-null-p
See string-or-null-p.
stringp
See stringp.
subrp
See subrp.
symbolp
See symbolp.
syntax-table-p
See syntax-table-p.
threadp
See threadp.
vectorp
See vectorp.
wholenump
See wholenump.
window-configuration-p
See window-configuration-p.
window-live-p
See window-live-p.
windowp
See windowp.
The most general way to check the type of an object is to call the
function type-of
. Recall that each object belongs to one and
only one primitive type; type-of
tells you which one (see Lisp Data Types). But type-of
knows nothing about non-primitive
types. In most cases, it is more convenient to use type predicates than
type-of
.
- Function: type-of object ¶
This function returns a symbol naming the primitive type of
object. The value is one of the symbols bool-vector
,
buffer
, char-table
, compiled-function
,
condition-variable
, cons
, finalizer
,
float
, font-entity
, font-object
,
font-spec
, frame
, hash-table
, integer
,
marker
, mutex
, overlay
, process
,
string
, subr
, symbol
, thread
,
vector
, window
, or window-configuration
.
However, if object is a record, the type specified by its first
slot is returned; Records.
(type-of 1)
⇒ integer
(type-of 'nil)
⇒ symbol
(type-of '()) ; ()
is nil
.
⇒ symbol
(type-of '(x))
⇒ cons
(type-of (record 'foo))
⇒ foo
2.8 Equality Predicates
Here we describe functions that test for equality between two
objects. Other functions test equality of contents between objects of
specific types, e.g., strings. For these predicates, see the
appropriate chapter describing the data type.
- Function: eq object1 object2 ¶
This function returns t
if object1 and object2 are
the same object, and nil
otherwise.
If object1 and object2 are symbols with the
same name, they are normally the same object—but see Creating and Interning Symbols for exceptions. For other non-numeric types (e.g., lists, vectors,
strings), two arguments with the same contents or elements are not
necessarily eq
to each other: they are eq
only if they
are the same object, meaning that a change in the contents of one will
be reflected by the same change in the contents of the other.
If object1 and object2 are numbers with differing types or values,
then they cannot be the same object and eq
returns nil
.
If they are fixnums with the same value,
then they are the same object and eq
returns t
.
If they were computed separately but happen to have the same value
and the same non-fixnum numeric type, then they might or might not be
the same object, and eq
returns t
or nil
depending on whether the Lisp interpreter created one object or two.
(eq 'foo 'foo)
⇒ t
(eq ?A ?A)
⇒ t
(eq 3.0 3.0)
⇒ t or nil
;; Equal floats may or may not be the same object.
(eq (make-string 3 ?A) (make-string 3 ?A))
⇒ nil
(eq "asdf" "asdf")
⇒ t or nil
;; Equal string constants or may not be the same object.
(eq '(1 (2 (3))) '(1 (2 (3))))
⇒ nil
(setq foo '(1 (2 (3))))
⇒ (1 (2 (3)))
(eq foo foo)
⇒ t
(eq foo '(1 (2 (3))))
⇒ nil
(eq [(1 2) 3] [(1 2) 3])
⇒ nil
(eq (point-marker) (point-marker))
⇒ nil
The make-symbol
function returns an uninterned symbol, distinct
from the symbol that is used if you write the name in a Lisp expression.
Distinct symbols with the same name are not eq
. See Creating and Interning Symbols.
(eq (make-symbol "foo") 'foo)
⇒ nil
The Emacs Lisp byte compiler may collapse identical literal objects,
such as literal strings, into references to the same object, with the
effect that the byte-compiled code will compare such objects as
eq
, while the interpreted version of the same code will not.
Therefore, your code should never rely on objects with the same
literal contents being either eq
or not eq
, it should
instead use functions that compare object contents such as
equal
, described below. Similarly, your code should not modify
literal objects (e.g., put text properties on literal strings), since
doing that might affect other literal objects of the same contents, if
the byte compiler collapses them.
- Function: equal object1 object2 ¶
This function returns t
if object1 and object2 have
equal components, and nil
otherwise. Whereas eq
tests
if its arguments are the same object, equal
looks inside
nonidentical arguments to see if their elements or contents are the
same. So, if two objects are eq
, they are equal
, but
the converse is not always true.
(equal 'foo 'foo)
⇒ t
(equal 456 456)
⇒ t
(equal "asdf" "asdf")
⇒ t
(eq "asdf" "asdf")
⇒ nil
(equal '(1 (2 (3))) '(1 (2 (3))))
⇒ t
(eq '(1 (2 (3))) '(1 (2 (3))))
⇒ nil
(equal [(1 2) 3] [(1 2) 3])
⇒ t
(eq [(1 2) 3] [(1 2) 3])
⇒ nil
(equal (point-marker) (point-marker))
⇒ t
(eq (point-marker) (point-marker))
⇒ nil
Comparison of strings is case-sensitive, but does not take account of
text properties—it compares only the characters in the strings.
See Text Properties. Use equal-including-properties
to also
compare text properties. For technical reasons, a unibyte string and
a multibyte string are equal
if and only if they contain the
same sequence of character codes and all these codes are in the range
0 through 127 (ASCII).
(equal "asdf" "ASDF")
⇒ nil
The equal
function recursively compares the contents of objects
if they are integers, strings, markers, vectors, bool-vectors,
byte-code function objects, char-tables, records, or font objects.
Other objects are considered equal
only if they are eq
.
For example, two distinct buffers are never considered equal
,
even if their textual contents are the same.
For equal
, equality is defined recursively; for example, given
two cons cells x and y, (equal x y)
returns t
if and only if both the expressions below return
t
:
(equal (car x) (car y))
(equal (cdr x) (cdr y))
Comparing circular lists may therefore cause deep recursion that leads
to an error, and this may result in counterintuitive behavior such as
(equal a b)
returning t
whereas (equal b a)
signals an error.
- Function: equal-including-properties object1 object2 ¶
This function behaves like equal
in all cases but also requires
that for two strings to be equal, they have the same text properties.
(equal "asdf" (propertize "asdf" 'asdf t))
⇒ t
(equal-including-properties "asdf"
(propertize "asdf" 'asdf t))
⇒ nil
2.9 Mutability
Some Lisp objects should never change. For example, the Lisp
expression "aaa"
yields a string, but you should not change
its contents. And some objects cannot be changed; for example,
although you can create a new number by calculating one, Lisp provides
no operation to change the value of an existing number.
Other Lisp objects are mutable: it is safe to change their
values via destructive operations involving side effects. For
example, an existing marker can be changed by moving the marker to
point to somewhere else.
Although numbers never change and all markers are mutable,
some types have members some of which are mutable and others not. These
types include conses, vectors, and strings. For example,
although "cons"
and (symbol-name 'cons)
both yield
strings that should not be changed, (copy-sequence "cons")
and
(make-string 3 ?a)
both yield mutable strings that can be
changed via later calls to aset
.
A mutable object stops being mutable if it is part of an expression
that is evaluated. For example:
(let* ((x (list 0.5))
(y (eval (list 'quote x))))
(setcar x 1.5) ;; The program should not do this.
y)
Although the list (0.5)
was mutable when it was created, it should not
have been changed via setcar
because it was given to eval
. The
reverse does not occur: an object that should not be changed never
becomes mutable afterwards.
If a program attempts to change objects that should not be
changed, the resulting behavior is undefined: the Lisp interpreter
might signal an error, or it might crash or behave unpredictably in
other ways.2
When similar constants occur as parts of a program, the Lisp
interpreter might save time or space by reusing existing constants or
their components. For example, (eq "abc" "abc")
returns
t
if the interpreter creates only one instance of the string
literal "abc"
, and returns nil
if it creates two
instances. Lisp programs should be written so that they work
regardless of whether this optimization is in use.
3 Numbers
GNU Emacs supports two numeric data types: integers and
floating-point numbers. Integers are whole numbers such as
-3, 0, 7, 13, and 511. Floating-point numbers are numbers with
fractional parts, such as -4.5, 0.0, and 2.71828. They can
also be expressed in exponential notation: ‘1.5e2’ is the same as
‘150.0’; here, ‘e2’ stands for ten to the second power, and
that is multiplied by 1.5. Integer computations are exact.
Floating-point computations often involve rounding errors, as the
numbers have a fixed amount of precision.
3.1 Integer Basics
The Lisp reader reads an integer as a nonempty sequence
of decimal digits with optional initial sign and optional
final period.
1 ; The integer 1.
1. ; The integer 1.
+1 ; Also the integer 1.
-1 ; The integer -1.
0 ; The integer 0.
-0 ; The integer 0.
The syntax for integers in bases other than 10 consists of ‘#’
followed by a radix indication followed by one or more digits. The
radix indications are ‘b’ for binary, ‘o’ for octal,
‘x’ for hex, and ‘radixr’ for radix radix.
Thus, ‘#binteger’ reads
integer in binary, and ‘#radixrinteger’ reads
integer in radix radix. Allowed values of radix run
from 2 to 36, and allowed digits are the first radix characters
taken from ‘0’–‘9’, ‘A’–‘Z’.
Letter case is ignored and there is no initial sign or final period.
For example:
#b101100 ⇒ 44
#o54 ⇒ 44
#x2c ⇒ 44
#24r1k ⇒ 44
To understand how various functions work on integers, especially the
bitwise operators (see Bitwise Operations on Integers), it is often helpful to
view the numbers in their binary form.
In binary, the decimal integer 5 looks like this:
(The ellipsis ‘…’ stands for a conceptually infinite number
of bits that match the leading bit; here, an infinite number of 0
bits. Later examples also use this ‘…’ notation.)
The integer -1 looks like this:
-1 is represented as all ones. (This is called two’s
complement notation.)
Subtracting 4 from -1 returns the negative integer -5.
In binary, the decimal integer 4 is 100. Consequently,
-5 looks like this:
Many of the functions described in this chapter accept markers for
arguments in place of numbers. (See Markers.) Since the actual
arguments to such functions may be either numbers or markers, we often
give these arguments the name number-or-marker. When the argument
value is a marker, its position value is used and its buffer is ignored.
In Emacs Lisp, text characters are represented by integers. Any
integer between zero and the value of (max-char)
, inclusive, is
considered to be valid as a character. See Character Codes.
Integers in Emacs Lisp are not limited to the machine word size.
Under the hood, though, there are two kinds of integers: smaller ones,
called fixnums, and larger ones, called bignums. Although
Emacs Lisp code ordinarily should not depend on whether an integer is
a fixnum or a bignum, older Emacs versions support only fixnums, some
functions in Emacs still accept only fixnums, and older Emacs Lisp
code may have trouble when given bignums. For example, while older
Emacs Lisp code could safely compare integers for numeric equality
with eq
, the presence of bignums means that equality predicates
like eql
and =
should now be used to compare integers.
The range of values for bignums is limited by the amount of main
memory, by machine characteristics such as the size of the word used
to represent a bignum’s exponent, and by the integer-width
variable. These limits are typically much more generous than the
limits for fixnums. A bignum is never numerically equal to a fixnum;
Emacs always represents an integer in fixnum range as a fixnum, not a
bignum.
The range of values for a fixnum depends on the machine. The
minimum range is -536,870,912 to 536,870,911 (30 bits; i.e.,
-2**29
to
2**29 - 1),
but many machines provide a wider range.
- Variable: most-positive-fixnum ¶
The value of this variable is the greatest “small” integer that Emacs
Lisp can handle. Typical values are
2**29 - 1
on 32-bit and
2**61 - 1
on 64-bit platforms.
- Variable: most-negative-fixnum ¶
The value of this variable is the numerically least “small” integer
that Emacs Lisp can handle. It is negative. Typical values are
-2**29
on 32-bit and
-2**61
on 64-bit platforms.
- Variable: integer-width ¶
The value of this variable is a nonnegative integer that controls
whether Emacs signals a range error when a large integer would be
calculated. Integers with absolute values less than
2**n,
where n is this variable’s value, do not signal a range error.
Attempts to create larger integers typically signal a range error,
although there might be no signal if a larger integer can be created cheaply.
Setting this variable to a large number can be costly if a computation
creates huge integers.
3.2 Floating-Point Basics
Floating-point numbers are useful for representing numbers that are
not integral. The range of floating-point numbers is the same as the
range of the C data type double
on the machine you are using.
On almost all computers supported by Emacs, this is IEEE
binary64 floating point format, which is standardized by
IEEE Std
754-2019 and is discussed further in David Goldberg’s paper
“What Every Computer Scientist Should Know About Floating-Point
Arithmetic”. On modern platforms, floating-point operations follow
the IEEE-754 standard closely; however, results are not always rounded
correctly on some systems, notably 32-bit x86.
On some old computer systems, Emacs may not use IEEE floating-point.
We know of one such system on which Emacs runs correctly, but does not
follow IEEE-754: the VAX running NetBSD using GCC 10.4.0, where the
VAX ‘D_Floating’ format is used instead. IBM System/370-derived
mainframes and their XL/C compiler are also capable of utilizing a
hexadecimal floating point format, but Emacs has not yet been built in
such a configuration.
The read syntax for floating-point numbers requires either a decimal
point, an exponent, or both. Optional signs (‘+’ or ‘-’)
precede the number and its exponent. For example, ‘1500.0’,
‘+15e2’, ‘15.0e+2’, ‘+1500000e-3’, and ‘.15e4’ are
five ways of writing a floating-point number whose value is 1500.
They are all equivalent. Like Common Lisp, Emacs Lisp requires at
least one digit after a decimal point in a floating-point number that
does not have an exponent;
‘1500.’ is an integer, not a floating-point number.
Emacs Lisp treats -0.0
as numerically equal to ordinary zero
with respect to numeric comparisons like =
. This follows the
IEEE floating-point standard, which says -0.0
and
0.0
are numerically equal even though other operations can
distinguish them.
The IEEE floating-point standard supports positive
infinity and negative infinity as floating-point values. It also
provides for a class of values called NaN, or “not a number”;
numerical functions return such values in cases where there is no
correct answer. For example, (/ 0.0 0.0)
returns a NaN.
A NaN is never numerically equal to any value, not even to itself.
NaNs carry a sign and a significand, and non-numeric functions treat
two NaNs as equal when their
signs and significands agree. Significands of NaNs are
machine-dependent, as are the digits in their string representation.
NaNs are not available on systems which do not use IEEE
floating-point arithmetic; if the read syntax for a NaN is used on a
VAX, for example, the reader signals an error.
When NaNs and signed zeros are involved, non-numeric functions like
eql
, equal
, sxhash-eql
, sxhash-equal
and
gethash
determine whether values are indistinguishable, not
whether they are numerically equal. For example, when x and
y are the same NaN, (equal x y)
returns t
whereas
(= x y)
uses numeric comparison and returns nil
;
conversely, (equal 0.0 -0.0)
returns nil
whereas
(= 0.0 -0.0)
returns t
.
Here are read syntaxes for these special floating-point values:
- infinity
‘1.0e+INF’ and ‘-1.0e+INF’
- not-a-number
‘0.0e+NaN’ and ‘-0.0e+NaN’
The following functions are specialized for handling floating-point
numbers:
- Function: isnan x ¶
This predicate returns t
if its floating-point argument is a NaN,
nil
otherwise.
- Function: frexp x ¶
This function returns a cons cell (s . e)
,
where s and e are respectively the significand and
exponent of the floating-point number x.
If x is finite, then s is a floating-point number between 0.5
(inclusive) and 1.0 (exclusive), e is an integer, and
x = s * 2**e.
If x is zero or infinity, then s is the same as x.
If x is a NaN, then s is also a NaN.
If x is zero, then e is 0.
- Function: ldexp s e ¶
Given a numeric significand s and an integer exponent e,
this function returns the floating point number
s * 2**e.
- Function: copysign x1 x2 ¶
This function copies the sign of x2 to the value of x1,
and returns the result. x1 and x2 must be floating point.
- Function: logb x ¶
This function returns the binary exponent of x. More precisely,
if x is finite and nonzero, the value is the logarithm base 2 of
|x|, rounded down to an integer. If x is zero or
infinite, the value is infinity; if x is a NaN, the value is a
NaN.
(logb 10)
⇒ 3
(logb 10.0e20)
⇒ 69
(logb 0)
⇒ -1.0e+INF
3.3 Type Predicates for Numbers
The functions in this section test for numbers, or for a specific
type of number. The functions integerp
and floatp
can
take any type of Lisp object as argument (they would not be of much
use otherwise), but the zerop
predicate requires a number as
its argument. See also integer-or-marker-p
and
number-or-marker-p
, in Predicates on Markers.
- Function: bignump object ¶
This predicate tests whether its argument is a large integer, and
returns t
if so, nil
otherwise. Unlike small integers,
large integers can be =
or eql
even if they are not eq
.
- Function: fixnump object ¶
This predicate tests whether its argument is a small integer, and
returns t
if so, nil
otherwise. Small integers can be
compared with eq
.
- Function: floatp object ¶
This predicate tests whether its argument is floating point
and returns t
if so, nil
otherwise.
- Function: integerp object ¶
This predicate tests whether its argument is an integer, and returns
t
if so, nil
otherwise.
- Function: numberp object ¶
This predicate tests whether its argument is a number (either integer or
floating point), and returns t
if so, nil
otherwise.
- Function: natnump object ¶
-
This predicate (whose name comes from the phrase “natural number”)
tests to see whether its argument is a nonnegative integer, and
returns t
if so, nil
otherwise. 0 is considered
non-negative.
wholenump
is a synonym for natnump
.
- Function: zerop number ¶
This predicate tests whether its argument is zero, and returns t
if so, nil
otherwise. The argument must be a number.
(zerop x)
is equivalent to (= x 0)
.
3.4 Comparison of Numbers
To test numbers for numerical equality, you should normally use
=
instead of non-numeric comparison predicates like eq
,
eql
and equal
. Distinct floating-point and large
integer objects can be numerically equal. If you use eq
to
compare them, you test whether they are the same object; if you
use eql
or equal
, you test whether their values are
indistinguishable. In contrast, =
uses numeric
comparison, and sometimes returns t
when a non-numeric
comparison would return nil
and vice versa. See Floating-Point Basics.
In Emacs Lisp, if two fixnums are numerically equal, they are the
same Lisp object. That is, eq
is equivalent to =
on
fixnums. It is sometimes convenient to use eq
for comparing
an unknown value with a fixnum, because eq
does not report an
error if the unknown value is not a number—it accepts arguments of
any type. By contrast, =
signals an error if the arguments are
not numbers or markers. However, it is better programming practice to
use =
if you can, even for comparing integers.
Sometimes it is useful to compare numbers with eql
or equal
,
which treat two numbers as equal if they have the same data type (both
integers, or both floating point) and the same value. By contrast,
=
can treat an integer and a floating-point number as equal.
See Equality Predicates.
There is another wrinkle: because floating-point arithmetic is not
exact, it is often a bad idea to check for equality of floating-point
values. Usually it is better to test for approximate equality.
Here’s a function to do this:
(defvar fuzz-factor 1.0e-6)
(defun approx-equal (x y)
(or (= x y)
(< (/ (abs (- x y))
(max (abs x) (abs y)))
fuzz-factor)))
- Function: = number-or-marker &rest number-or-markers ¶
This function tests whether all its arguments are numerically equal,
and returns t
if so, nil
otherwise.
- Function: eql value1 value2 ¶
This function acts like eq
except when both arguments are
numbers. It compares numbers by type and numeric value, so that
(eql 1.0 1)
returns nil
, but (eql 1.0 1.0)
and
(eql 1 1)
both return t
. This can be used to compare
large integers as well as small ones.
Floating-point values with the same sign, exponent and fraction are eql
.
This differs from numeric comparison: (eql 0.0 -0.0)
returns
nil
and (eql 0.0e+NaN 0.0e+NaN)
returns t
,
whereas =
does the opposite.
- Function: /= number-or-marker1 number-or-marker2 ¶
This function tests whether its arguments are numerically equal, and
returns t
if they are not, and nil
if they are.
- Function: < number-or-marker &rest number-or-markers ¶
This function tests whether each argument is strictly less than the
following argument. It returns t
if so, nil
otherwise.
- Function: <= number-or-marker &rest number-or-markers ¶
This function tests whether each argument is less than or equal to
the following argument. It returns t
if so, nil
otherwise.
- Function: > number-or-marker &rest number-or-markers ¶
This function tests whether each argument is strictly greater than
the following argument. It returns t
if so, nil
otherwise.
- Function: >= number-or-marker &rest number-or-markers ¶
This function tests whether each argument is greater than or equal to
the following argument. It returns t
if so, nil
otherwise.
- Function: max number-or-marker &rest numbers-or-markers ¶
This function returns the largest of its arguments.
(max 20)
⇒ 20
(max 1 2.5)
⇒ 2.5
(max 1 3 2.5)
⇒ 3
- Function: min number-or-marker &rest numbers-or-markers ¶
This function returns the smallest of its arguments.
- Function: abs number ¶
This function returns the absolute value of number.
3.5 Numeric Conversions
To convert an integer to floating point, use the function float
.
- Function: float number ¶
This returns number converted to floating point.
If number is already floating point, float
returns
it unchanged.
There are four functions to convert floating-point numbers to
integers; they differ in how they round. All accept an argument
number and an optional argument divisor. Both arguments
may be integers or floating-point numbers. divisor may also be
nil
. If divisor is nil
or omitted, these
functions convert number to an integer, or return it unchanged
if it already is an integer. If divisor is non-nil
, they
divide number by divisor and convert the result to an
integer. If divisor is zero (whether integer or
floating point), Emacs signals an arith-error
error.
- Function: truncate number &optional divisor ¶
This returns number, converted to an integer by rounding towards
zero.
(truncate 1.2)
⇒ 1
(truncate 1.7)
⇒ 1
(truncate -1.2)
⇒ -1
(truncate -1.7)
⇒ -1
- Function: floor number &optional divisor ¶
This returns number, converted to an integer by rounding downward
(towards negative infinity).
If divisor is specified, this uses the kind of division
operation that corresponds to mod
, rounding downward.
(floor 1.2)
⇒ 1
(floor 1.7)
⇒ 1
(floor -1.2)
⇒ -2
(floor -1.7)
⇒ -2
(floor 5.99 3)
⇒ 1
- Function: ceiling number &optional divisor ¶
This returns number, converted to an integer by rounding upward
(towards positive infinity).
(ceiling 1.2)
⇒ 2
(ceiling 1.7)
⇒ 2
(ceiling -1.2)
⇒ -1
(ceiling -1.7)
⇒ -1
- Function: round number &optional divisor ¶
This returns number, converted to an integer by rounding towards the
nearest integer. Rounding a value equidistant between two integers
returns the even integer.
(round 1.2)
⇒ 1
(round 1.7)
⇒ 2
(round -1.2)
⇒ -1
(round -1.7)
⇒ -2
3.6 Arithmetic Operations
Emacs Lisp provides the traditional four arithmetic operations
(addition, subtraction, multiplication, and division), as well as
remainder and modulus functions, and functions to add or subtract 1.
Except for %
, each of these functions accepts both integer and
floating-point arguments, and returns a floating-point number if any
argument is floating point.
- Function: 1+ number-or-marker ¶
This function returns number-or-marker plus 1.
For example,
(setq foo 4)
⇒ 4
(1+ foo)
⇒ 5
This function is not analogous to the C operator ++
—it does not
increment a variable. It just computes a sum. Thus, if we continue,
If you want to increment the variable, you must use setq
,
like this:
- Function: 1- number-or-marker ¶
This function returns number-or-marker minus 1.
- Function: + &rest numbers-or-markers ¶
This function adds its arguments together. When given no arguments,
+
returns 0.
(+)
⇒ 0
(+ 1)
⇒ 1
(+ 1 2 3 4)
⇒ 10
- Function: - &optional number-or-marker &rest more-numbers-or-markers ¶
The -
function serves two purposes: negation and subtraction.
When -
has a single argument, the value is the negative of the
argument. When there are multiple arguments, -
subtracts each of
the more-numbers-or-markers from number-or-marker,
cumulatively. If there are no arguments, the result is 0.
(- 10 1 2 3 4)
⇒ 0
(- 10)
⇒ -10
(-)
⇒ 0
- Function: * &rest numbers-or-markers ¶
This function multiplies its arguments together, and returns the
product. When given no arguments, *
returns 1.
(*)
⇒ 1
(* 1)
⇒ 1
(* 1 2 3 4)
⇒ 24
- Function: / number &rest divisors ¶
With one or more divisors, this function divides number
by each divisor in divisors in turn, and returns the quotient.
With no divisors, this function returns 1/number, i.e.,
the multiplicative inverse of number. Each argument may be a
number or a marker.
If all the arguments are integers, the result is an integer, obtained
by rounding the quotient towards zero after each division.
(/ 6 2)
⇒ 3
(/ 5 2)
⇒ 2
(/ 5.0 2)
⇒ 2.5
(/ 5 2.0)
⇒ 2.5
(/ 5.0 2.0)
⇒ 2.5
(/ 4.0)
⇒ 0.25
(/ 4)
⇒ 0
(/ 25 3 2)
⇒ 4
(/ -17 6)
⇒ -2
If you divide an integer by the integer 0, Emacs signals an
arith-error
error (see Errors). On systems using IEEE-754
floating-point, floating-point division of a nonzero number by zero
yields either positive or negative infinity (see Floating-Point Basics);
otherwise, an arith-error
is signaled as usual.
- Function: % dividend divisor ¶
-
This function returns the integer remainder after division of dividend
by divisor. The arguments must be integers or markers.
For any two integers dividend and divisor,
(+ (% dividend divisor)
(* (/ dividend divisor) divisor))
always equals dividend if divisor is nonzero.
(% 9 4)
⇒ 1
(% -9 4)
⇒ -1
(% 9 -4)
⇒ 1
(% -9 -4)
⇒ -1
- Function: mod dividend divisor ¶
-
This function returns the value of dividend modulo divisor;
in other words, the remainder after division of dividend
by divisor, but with the same sign as divisor.
The arguments must be numbers or markers.
Unlike %
, mod
permits floating-point arguments; it
rounds the quotient downward (towards minus infinity) to an integer,
and uses that quotient to compute the remainder.
If divisor is zero, mod
signals an arith-error
error if both arguments are integers, and returns a NaN otherwise.
(mod 9 4)
⇒ 1
(mod -9 4)
⇒ 3
(mod 9 -4)
⇒ -3
(mod -9 -4)
⇒ -1
(mod 5.5 2.5)
⇒ .5
For any two numbers dividend and divisor,
(+ (mod dividend divisor)
(* (floor dividend divisor) divisor))
always equals dividend, subject to rounding error if either
argument is floating point and to an arith-error
if dividend is an
integer and divisor is 0. For floor
, see Numeric Conversions.
3.7 Rounding Operations
The functions ffloor
, fceiling
, fround
, and
ftruncate
take a floating-point argument and return a floating-point
result whose value is a nearby integer. ffloor
returns the
nearest integer below; fceiling
, the nearest integer above;
ftruncate
, the nearest integer in the direction towards zero;
fround
, the nearest integer.
- Function: ffloor float ¶
This function rounds float to the next lower integral value, and
returns that value as a floating-point number.
- Function: fceiling float ¶
This function rounds float to the next higher integral value, and
returns that value as a floating-point number.
- Function: ftruncate float ¶
This function rounds float towards zero to an integral value, and
returns that value as a floating-point number.
- Function: fround float ¶
This function rounds float to the nearest integral value,
and returns that value as a floating-point number.
Rounding a value equidistant between two integers returns the even integer.
3.8 Bitwise Operations on Integers
In a computer, an integer is represented as a binary number, a
sequence of bits (digits which are either zero or one).
Conceptually the bit sequence is infinite on the left, with the
most-significant bits being all zeros or all ones. A bitwise
operation acts on the individual bits of such a sequence. For example,
shifting moves the whole sequence left or right one or more places,
reproducing the same pattern moved over.
The bitwise operations in Emacs Lisp apply only to integers.
- Function: ash integer1 count ¶
-
ash
(arithmetic shift) shifts the bits in integer1
to the left count places, or to the right if count is
negative. Left shifts introduce zero bits on the right; right shifts
discard the rightmost bits. Considered as an integer operation,
ash
multiplies integer1 by
2**count,
and then converts the result to an integer by rounding downward, toward
minus infinity.
Here are examples of ash
, shifting a pattern of bits one place
to the left and to the right. These examples show only the low-order
bits of the binary pattern; leading bits all agree with the
highest-order bit shown. As you can see, shifting left by one is
equivalent to multiplying by two, whereas shifting right by one is
equivalent to dividing by two and then rounding toward minus infinity.
(ash 7 1) ⇒ 14
;; Decimal 7 becomes decimal 14.
…000111
⇒
…001110
(ash 7 -1) ⇒ 3
…000111
⇒
…000011
(ash -7 1) ⇒ -14
…111001
⇒
…110010
(ash -7 -1) ⇒ -4
…111001
⇒
…111100
Here are examples of shifting left or right by two bits:
; binary values
(ash 5 2) ; 5 = …000101
⇒ 20 ; = …010100
(ash -5 2) ; -5 = …111011
⇒ -20 ; = …101100
(ash 5 -2)
⇒ 1 ; = …000001
(ash -5 -2)
⇒ -2 ; = …111110
- Function: lsh integer1 count ¶
-
lsh
, which is an abbreviation for logical shift, shifts the
bits in integer1 to the left count places, or to the right
if count is negative, bringing zeros into the vacated bits. If
count is negative, then integer1 must be either a fixnum
or a positive bignum, and lsh
treats a negative fixnum as if it
were unsigned by subtracting twice most-negative-fixnum
before
shifting, producing a nonnegative result. This quirky behavior dates
back to when Emacs supported only fixnums; nowadays ash
is a
better choice.
As lsh
behaves like ash
except when integer1 and
count1 are both negative, the following examples focus on these
exceptional cases. These examples assume 30-bit fixnums.
; binary values
(ash -7 -1) ; -7 = …111111111111111111111111111001
⇒ -4 ; = …111111111111111111111111111100
(lsh -7 -1)
⇒ 536870908 ; = …011111111111111111111111111100
(ash -5 -2) ; -5 = …111111111111111111111111111011
⇒ -2 ; = …111111111111111111111111111110
(lsh -5 -2)
⇒ 268435454 ; = …001111111111111111111111111110
- Function: logand &rest ints-or-markers ¶
This function returns the bitwise AND of the arguments: the nth
bit is 1 in the result if, and only if, the nth bit is 1 in all
the arguments.
For example, using 4-bit binary numbers, the bitwise AND of 13 and
12 is 12: 1101 combined with 1100 produces 1100.
In both the binary numbers, the leftmost two bits are both 1
so the leftmost two bits of the returned value are both 1.
However, for the rightmost two bits, each is 0 in at least one of
the arguments, so the rightmost two bits of the returned value are both 0.
Therefore,
If logand
is not passed any argument, it returns a value of
-1. This number is an identity element for logand
because its binary representation consists entirely of ones. If
logand
is passed just one argument, it returns that argument.
; binary values
(logand 14 13) ; 14 = …001110
; 13 = …001101
⇒ 12 ; 12 = …001100
(logand 14 13 4) ; 14 = …001110
; 13 = …001101
; 4 = …000100
⇒ 4 ; 4 = …000100
(logand)
⇒ -1 ; -1 = …111111
- Function: logior &rest ints-or-markers ¶
This function returns the bitwise inclusive OR of its arguments: the nth
bit is 1 in the result if, and only if, the nth bit is 1 in at
least one of the arguments. If there are no arguments, the result is 0,
which is an identity element for this operation. If logior
is
passed just one argument, it returns that argument.
; binary values
(logior 12 5) ; 12 = …001100
; 5 = …000101
⇒ 13 ; 13 = …001101
(logior 12 5 7) ; 12 = …001100
; 5 = …000101
; 7 = …000111
⇒ 15 ; 15 = …001111
- Function: logxor &rest ints-or-markers ¶
This function returns the bitwise exclusive OR of its arguments: the
nth bit is 1 in the result if, and only if, the nth bit is
1 in an odd number of the arguments. If there are no arguments, the
result is 0, which is an identity element for this operation. If
logxor
is passed just one argument, it returns that argument.
; binary values
(logxor 12 5) ; 12 = …001100
; 5 = …000101
⇒ 9 ; 9 = …001001
(logxor 12 5 7) ; 12 = …001100
; 5 = …000101
; 7 = …000111
⇒ 14 ; 14 = …001110
- Function: lognot integer ¶
This function returns the bitwise complement of its argument: the nth
bit is one in the result if, and only if, the nth bit is zero in
integer, and vice-versa. The result equals -1 -
integer.
(lognot 5)
⇒ -6
;; 5 = …000101
;; becomes
;; -6 = …111010
- Function: logcount integer ¶
This function returns the Hamming weight of integer: the
number of ones in the binary representation of integer.
If integer is negative, it returns the number of zero bits in
its two’s complement binary representation. The result is always
nonnegative.
(logcount 43) ; 43 = …000101011
⇒ 4
(logcount -43) ; -43 = …111010101
⇒ 3
3.9 Standard Mathematical Functions
These mathematical functions allow integers as well as floating-point
numbers as arguments.
- Function: sin arg ¶
- Function: cos arg ¶
- Function: tan arg ¶
These are the basic trigonometric functions, with argument arg
measured in radians.
- Function: asin arg ¶
The value of (asin arg)
is a number between
-pi/2
and
pi/2
(inclusive) whose sine is arg. If arg is out of range
(outside [-1, 1]), asin
returns a NaN.
- Function: acos arg ¶
The value of (acos arg)
is a number between 0 and
pi
(inclusive) whose cosine is arg. If arg is out of range
(outside [-1, 1]), acos
returns a NaN.
- Function: atan y &optional x ¶
The value of (atan y)
is a number between
-pi/2
and
pi/2
(exclusive) whose tangent is y. If the optional second
argument x is given, the value of (atan y x)
is the
angle in radians between the vector [x, y]
and the
X
axis.
- Function: exp arg ¶
This is the exponential function; it returns e to the power
arg.
- Function: log arg &optional base ¶
This function returns the logarithm of arg, with base
base. If you don’t specify base, the natural base
e is used. If arg or base is negative, log
returns a NaN.
- Function: expt x y ¶
This function returns x raised to power y. If both
arguments are integers and y is nonnegative, the result is an
integer; in this case, overflow signals an error, so watch out.
If x is a finite negative number and y is a finite
non-integer, expt
returns a NaN.
- Function: sqrt arg ¶
This returns the square root of arg. If arg is finite
and less than zero, sqrt
returns a NaN.
In addition, Emacs defines the following common mathematical
constants:
- Variable: float-e ¶
The mathematical constant e (2.71828…).
- Variable: float-pi ¶
The mathematical constant pi (3.14159…).
3.10 Random Numbers
A deterministic computer program cannot generate true random
numbers. For most purposes, pseudo-random numbers suffice. A
series of pseudo-random numbers is generated in a deterministic
fashion. The numbers are not truly random, but they have certain
properties that mimic a random series. For example, all possible
values occur equally often in a pseudo-random series.
Pseudo-random numbers are generated from a seed value. Starting from
any given seed, the random
function always generates the same
sequence of numbers. By default, Emacs initializes the random seed at
startup, in such a way that the sequence of values of random
(with overwhelming likelihood) differs in each Emacs run.
The random seed is typically initialized from system entropy;
however, on obsolescent platforms lacking entropy pools,
the seed is taken from less-random volatile data such as the current time.
Sometimes you want the random number sequence to be repeatable. For
example, when debugging a program whose behavior depends on the random
number sequence, it is helpful to get the same behavior in each
program run. To make the sequence repeat, execute (random "")
.
This sets the seed to a constant value for your particular Emacs
executable (though it may differ for other Emacs builds). You can use
other strings to choose various seed values.
- Function: random &optional limit ¶
This function returns a pseudo-random integer. Repeated calls return a
series of pseudo-random integers.
If limit is a positive integer, the value is chosen to be
nonnegative and less than limit. Otherwise, the value might be
any fixnum, i.e., any integer from most-negative-fixnum
through
most-positive-fixnum
(see Integer Basics).
If limit is a string, it means to choose a new seed based on the
string’s contents. This causes later calls to random
to return
a reproducible sequence of results.
If limit is t
, it means to choose a new seed as if Emacs
were restarting. This causes later calls to random
to return
an unpredictable sequence of results.
If you need a random nonce for cryptographic purposes, using
random
is typically not the best approach, for several reasons:
- Although you can use
(random t)
to consult system entropy,
doing so can adversely affect other parts of your program that benefit
from reproducible results.
- The system-dependent pseudo-random number generator (PRNG) used by
random
is not necessarily suitable for cryptography.
- A call to
(random t)
does not give direct access to system
entropy; the entropy is passed through the system-dependent PRNG, thus
possibly biasing the results.
- On typical platforms the random seed contains only 32 bits, which is
typically narrower than an Emacs fixnum, and is not nearly enough for
cryptographic purposes.
- A
(random t)
call leaves information about the nonce scattered
about Emacs’s internal state, increasing the size of the internal
attack surface.
- On obsolescent platforms lacking entropy pools,
(random t)
is
seeded from a cryptographically weak source.
4 Strings and Characters
A string in Emacs Lisp is an array that contains an ordered sequence
of characters. Strings are used as names of symbols, buffers, and
files; to send messages to users; to hold text being copied between
buffers; and for many other purposes. Because strings are so important,
Emacs Lisp has many functions expressly for manipulating them. Emacs
Lisp programs use strings more often than individual characters.
See Putting Keyboard Events in Strings, for special considerations for strings of
keyboard character events.
4.1 String and Character Basics
A character is a Lisp object which represents a single character of
text. In Emacs Lisp, characters are simply integers; whether an
integer is a character or not is determined only by how it is used.
See Character Codes, for details about character representation in
Emacs.
A string is a fixed sequence of characters. It is a type of
sequence called an array, meaning that its length is fixed and
cannot be altered once it is created (see Sequences, Arrays, and Vectors). Unlike in C, Emacs Lisp strings are not terminated
by a distinguished character code.
Since strings are arrays, and therefore sequences as well, you can
operate on them with the general array and sequence functions documented
in Sequences, Arrays, and Vectors. For example, you can access
individual characters in a string using the function aref
(see Functions that Operate on Arrays).
There are two text representations for non-ASCII
characters in Emacs strings (and in buffers): unibyte and multibyte.
For most Lisp programming, you don’t need to be concerned with these
two representations. See Text Representations, for details.
Sometimes key sequences are represented as unibyte strings. When a
unibyte string is a key sequence, string elements in the range 128 to
255 represent meta characters (which are large integers) rather than
character codes in the range 128 to 255. Strings cannot hold
characters that have the hyper, super or alt modifiers; they can hold
ASCII control characters, but no other control characters.
They do not distinguish case in ASCII control characters.
If you want to store such characters in a sequence, such as a key
sequence, you must use a vector instead of a string. See Character Type, for more information about keyboard input characters.
Strings are useful for holding regular expressions. You can also
match regular expressions against strings with string-match
(see Regular Expression Searching). The functions match-string
(see Simple Match Data Access) and replace-match
(see Replacing the Text that Matched) are useful for decomposing and modifying strings after
matching regular expressions against them.
Like a buffer, a string can contain text properties for the characters
in it, as well as the characters themselves. See Text Properties.
All the Lisp primitives that copy text from strings to buffers or other
strings also copy the properties of the characters being copied.
See Text, for information about functions that display strings or
copy them into buffers. See Character Type, and String Type,
for information about the syntax of characters and strings.
See Non-ASCII Characters, for functions to convert between text
representations and to encode and decode character codes.
Also, note that length
should not be used for computing
the width of a string on display; use string-width
(see Size of Displayed Text) instead.
4.2 Predicates for Strings
For more information about general sequence and array predicates,
see Sequences, Arrays, and Vectors, and Arrays.
- Function: stringp object ¶
This function returns t
if object is a string, nil
otherwise.
- Function: string-or-null-p object ¶
This function returns t
if object is a string or
nil
. It returns nil
otherwise.
- Function: char-or-string-p object ¶
This function returns t
if object is a string or a
character (i.e., an integer), nil
otherwise.
4.3 Creating Strings
The following functions create strings, either from scratch, or by
putting strings together, or by taking them apart. (For functions
that create strings based on the modified contents of other strings,
like string-replace
and replace-regexp-in-string
, see
Search and Replace.)
- Function: make-string count character &optional multibyte ¶
This function returns a string made up of count repetitions of
character. If count is negative, an error is signaled.
(make-string 5 ?x)
⇒ "xxxxx"
(make-string 0 ?x)
⇒ ""
Normally, if character is an ASCII character, the
result is a unibyte string. But if the optional argument
multibyte is non-nil
, the function will produce a
multibyte string instead. This is useful when you later need to
concatenate the result with non-ASCII strings or replace
some of its characters with non-ASCII characters.
Other functions to compare with this one include make-vector
(see Vectors) and make-list
(see Building Cons Cells and Lists).
- Function: string &rest characters ¶
This returns a string containing the characters characters.
(string ?a ?b ?c)
⇒ "abc"
- Function: substring string &optional start end ¶
This function returns a new string which consists of those characters
from string in the range from (and including) the character at the
index start up to (but excluding) the character at the index
end. The first character is at index zero. With one argument,
this function just copies string.
(substring "abcdefg" 0 3)
⇒ "abc"
In the above example, the index for ‘a’ is 0, the index for
‘b’ is 1, and the index for ‘c’ is 2. The index 3—which
is the fourth character in the string—marks the character position
up to which the substring is copied. Thus, ‘abc’ is copied from
the string "abcdefg"
.
A negative number counts from the end of the string, so that -1
signifies the index of the last character of the string. For example:
(substring "abcdefg" -3 -1)
⇒ "ef"
In this example, the index for ‘e’ is -3, the index for
‘f’ is -2, and the index for ‘g’ is -1.
Therefore, ‘e’ and ‘f’ are included, and ‘g’ is excluded.
When nil
is used for end, it stands for the length of the
string. Thus,
(substring "abcdefg" -3 nil)
⇒ "efg"
Omitting the argument end is equivalent to specifying nil
.
It follows that (substring string 0)
returns a copy of all
of string.
(substring "abcdefg" 0)
⇒ "abcdefg"
But we recommend copy-sequence
for this purpose (see Sequences).
If the characters copied from string have text properties, the
properties are copied into the new string also. See Text Properties.
substring
also accepts a vector for the first argument.
For example:
(substring [a b (c) "d"] 1 3)
⇒ [b (c)]
A wrong-type-argument
error is signaled if start is not
an integer or if end is neither an integer nor nil
. An
args-out-of-range
error is signaled if start indicates a
character following end, or if either integer is out of range
for string.
Contrast this function with buffer-substring
(see Examining Buffer Contents), which returns a string containing a portion of the text in
the current buffer. The beginning of a string is at index 0, but the
beginning of a buffer is at index 1.
- Function: substring-no-properties string &optional start end ¶
This works like substring
but discards all text properties from
the value. Also, start may be omitted or nil
, which is
equivalent to 0. Thus, (substring-no-properties string)
returns a copy of string, with all text
properties removed.
- Function: concat &rest sequences ¶
-
This function returns a string consisting of the characters in the
arguments passed to it (along with their text properties, if any). The
arguments may be strings, lists of numbers, or vectors of numbers; they
are not themselves changed. If concat
receives no arguments, it
returns an empty string.
(concat "abc" "-def")
⇒ "abc-def"
(concat "abc" (list 120 121) [122])
⇒ "abcxyz"
;; nil
is an empty sequence.
(concat "abc" nil "-def")
⇒ "abc-def"
(concat "The " "quick brown " "fox.")
⇒ "The quick brown fox."
(concat)
⇒ ""
This function does not always allocate a new string. Callers are
advised not rely on the result being a new string nor on it being
eq
to an existing string.
In particular, mutating the returned value may inadvertently change
another string, alter a constant string in the program, or even raise
an error. To obtain a string that you can safely mutate, use
copy-sequence
on the result.
For information about other concatenation functions, see the
description of mapconcat
in Mapping Functions,
vconcat
in Functions for Vectors, and append
in Building Cons Cells and Lists. For concatenating individual command-line arguments into a
string to be used as a shell command, see combine-and-quote-strings.
- Function: split-string string &optional separators omit-nulls trim ¶
This function splits string into substrings based on the regular
expression separators (see Regular Expressions). Each match
for separators defines a splitting point; the substrings between
splitting points are made into a list, which is returned.
If separators is nil
(or omitted), the default is the
value of split-string-default-separators
and the function
behaves as if omit-nulls were t
.
If omit-nulls is nil
(or omitted), the result contains
null strings whenever there are two consecutive matches for
separators, or a match is adjacent to the beginning or end of
string. If omit-nulls is t
, these null strings are
omitted from the result.
If the optional argument trim is non-nil
, it should be a
regular expression to match text to trim from the beginning and end of
each substring. If trimming makes the substring empty, it is treated
as null.
If you need to split a string into a list of individual command-line
arguments suitable for call-process
or start-process
,
see split-string-and-unquote.
Examples:
(split-string " two words ")
⇒ ("two" "words")
The result is not ("" "two" "words" "")
, which would rarely be
useful. If you need such a result, use an explicit value for
separators:
(split-string " two words "
split-string-default-separators)
⇒ ("" "two" "words" "")
(split-string "Soup is good food" "o")
⇒ ("S" "up is g" "" "d f" "" "d")
(split-string "Soup is good food" "o" t)
⇒ ("S" "up is g" "d f" "d")
(split-string "Soup is good food" "o+")
⇒ ("S" "up is g" "d f" "d")
Empty matches do count, except that split-string
will not look
for a final empty match when it already reached the end of the string
using a non-empty match or when string is empty:
(split-string "aooob" "o*")
⇒ ("" "a" "" "b" "")
(split-string "ooaboo" "o*")
⇒ ("" "" "a" "b" "")
(split-string "" "")
⇒ ("")
However, when separators can match the empty string,
omit-nulls is usually t
, so that the subtleties in the
three previous examples are rarely relevant:
(split-string "Soup is good food" "o*" t)
⇒ ("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d")
(split-string "Nice doggy!" "" t)
⇒ ("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!")
(split-string "" "" t)
⇒ nil
Somewhat odd, but predictable, behavior can occur for certain
“non-greedy” values of separators that can prefer empty
matches over non-empty matches. Again, such values rarely occur in
practice:
(split-string "ooo" "o*" t)
⇒ nil
(split-string "ooo" "\\|o+" t)
⇒ ("o" "o" "o")
- Variable: split-string-default-separators ¶
The default value of separators for split-string
. Its
usual value is "[ \f\t\n\r\v]+"
.
- Function: string-clean-whitespace string ¶
Clean up the whitespace in string by collapsing stretches of
whitespace to a single space character, as well as removing all
whitespace from the start and the end of string.
- Function: string-trim-left string &optional regexp ¶
Remove the leading text that matches regexp from string.
regexp defaults to ‘[ \t\n\r]+’.
- Function: string-trim-right string &optional regexp ¶
Remove the trailing text that matches regexp from string.
regexp defaults to ‘[ \t\n\r]+’.
- Function: string-trim string &optional trim-left trim-right ¶
Remove the leading text that matches trim-left and trailing text
that matches trim-right from string. Both regexps
default to ‘[ \t\n\r]+’.
- Function: string-fill string length ¶
Attempt to Word-wrap string so that no lines are longer than
length. Filling is done on whitespace boundaries only. If
there are individual words that are longer than length, these
will not be shortened.
- Function: string-limit string length &optional end coding-system ¶
If string is shorter than length characters, string
is returned as is. Otherwise, return a substring of string
consisting of the first length characters. If the optional
end parameter is given, return a string of the length last
characters instead.
If coding-system is non-nil
, string will be encoded
before limiting, and the result will be a unibyte string that’s
shorter than length
bytes. If string contains characters
that are encoded into several bytes (for instance, when using
utf-8
), the resulting unibyte string is never truncated in the
middle of a character representation.
This function measures the string length in characters or bytes, and
thus is generally inappropriate if you need to shorten strings for
display purposes; use truncate-string-to-width
or
window-text-pixel-size
or string-glyph-split
instead
(see Size of Displayed Text).
- Function: string-lines string &optional omit-nulls keep-newlines ¶
Split string into a list of strings on newline boundaries. If
the optional argument omit-nulls is non-nil
, remove empty
lines from the results. If the optional argument keep-newlines
is non-nil
, don’t remove the trailing newlines from the result
strings.
- Function: string-pad string length &optional padding start ¶
Pad string to be of the given length using padding
as the padding character. padding defaults to the space
character. If string is longer than length, no padding is
done. If start is nil
or omitted, the padding is
appended to the characters of string, and if it’s
non-nil
, the padding is prepended to string’s characters.
- Function: string-chop-newline string ¶
Remove the final newline, if any, from string.
4.4 Modifying Strings
You can alter the contents of a mutable string via operations
described in this section. See Mutability.
The most basic way to alter the contents of an existing string is with
aset
(see Functions that Operate on Arrays). (aset string idx char)
stores char into string at character
index idx. It will automatically convert a pure-ASCII
string to a multibyte string (see Text Representations) if
needed, but we recommend to always make sure string is multibyte
(e.g., by using string-to-multibyte
, see Converting Text Representations), if char is a non-ASCII character, not
a raw byte.
A more powerful function is store-substring
:
- Function: store-substring string idx obj ¶
This function alters part of the contents of the specified string,
by storing obj starting at character index idx. The
argument obj may be either a character (in which case the function
behaves exactly as aset
) or a (smaller) string. If obj
is a multibyte string, we recommend to make sure string is also
multibyte, even if it’s pure-ASCII.
Since it is impossible to change the number of characters in an
existing string, it is an error if obj consists of more
characters than would fit in string starting at character index
idx.
To clear out a string that contained a password, use
clear-string
:
- Function: clear-string string ¶
This makes string a unibyte string and clears its contents to
zeros. It may also change string’s length.
4.5 Comparison of Characters and Strings
- Function: char-equal character1 character2 ¶
This function returns t
if the arguments represent the same
character, nil
otherwise. This function ignores differences
in case if case-fold-search
is non-nil
.
(char-equal ?x ?x)
⇒ t
(let ((case-fold-search nil))
(char-equal ?x ?X))
⇒ nil
- Function: string= string1 string2 ¶
This function returns t
if the characters of the two strings
match exactly. Symbols are also allowed as arguments, in which case
the symbol names are used. Case is always significant, regardless of
case-fold-search
.
This function is equivalent to equal
for comparing two strings
(see Equality Predicates). In particular, the text properties of
the two strings are ignored; use equal-including-properties
if
you need to distinguish between strings that differ only in their text
properties. However, unlike equal
, if either argument is not a
string or symbol, string=
signals an error.
(string= "abc" "abc")
⇒ t
(string= "abc" "ABC")
⇒ nil
(string= "ab" "ABC")
⇒ nil
A unibyte and a multibyte string are equal in the sense of
string=
if and only if they contain the same sequence of
character codes all being in the range 0–127 (ASCII).
See Text Representations.
- Function: string-equal string1 string2 ¶
string-equal
is another name for string=
.
- Function: string-equal-ignore-case string1 string2 ¶
string-equal-ignore-case
compares strings ignoring case
differences, like char-equal
when case-fold-search
is
t
.
- Function: string-collate-equalp string1 string2 &optional locale ignore-case ¶
This function returns t
if string1 and string2 are
equal with respect to the collation rules of the specified
locale, which defaults to your current system locale. A
collation rule is not only
determined by the lexicographic order of the characters contained in
string1 and string2, but also by further rules about
relations between these characters. Usually, it is defined by the
locale environment with which Emacs is running and by the Standard C
library against which Emacs was linked3.
For example, characters with different code points but the same
meaning, like different grave accent Unicode characters, might, in
some locales, be considered as equal:
(string-collate-equalp (string ?\uFF40) (string ?\u1FEF))
⇒ t
The optional argument locale, a string, overrides the setting of
your current locale identifier for collation. The value is system
dependent; a locale "en_US.UTF-8"
is applicable on POSIX
systems, while it would be, e.g., "enu_USA.1252"
on MS-Windows
systems.
If ignore-case is non-nil
, characters are compared
case-insensitively, by converting them to lower-case. However, if the
underlying system library doesn’t provide locale-specific collation
rules, this function falls back to string-equal
, in which case
the ignore-case argument is ignored, and the comparison will
always be case-sensitive.
To emulate Unicode-compliant collation on MS-Windows systems,
bind w32-collate-ignore-punctuation
to a non-nil
value, since
the codeset part of the locale cannot be "UTF-8"
on MS-Windows.
If your system does not support a locale environment, this function
behaves like string-equal
.
Do not use this function to compare file names for equality, as
filesystems generally don’t honor linguistic equivalence of strings
that collation implements.
- Function: string< string1 string2 ¶
This function compares two strings a character at a time. It
scans both the strings at the same time to find the first pair of corresponding
characters that do not match. If the lesser character of these two is
the character from string1, then string1 is less, and this
function returns t
. If the lesser character is the one from
string2, then string1 is greater, and this function returns
nil
. If the two strings match entirely, the value is nil
.
Pairs of characters are compared according to their character codes.
Keep in mind that lower case letters have higher numeric values in the
ASCII character set than their upper case counterparts; digits and
many punctuation characters have a lower numeric value than upper case
letters. An ASCII character is less than any non-ASCII
character; a unibyte non-ASCII character is always less than any
multibyte non-ASCII character (see Text Representations).
(string< "abc" "abd")
⇒ t
(string< "abd" "abc")
⇒ nil
(string< "123" "abc")
⇒ t
When the strings have different lengths, and they match up to the
length of string1, then the result is t
. If they match up
to the length of string2, the result is nil
. A string of
no characters is less than any other string.
(string< "" "abc")
⇒ t
(string< "ab" "abc")
⇒ t
(string< "abc" "")
⇒ nil
(string< "abc" "ab")
⇒ nil
(string< "" "")
⇒ nil
Symbols are also allowed as arguments, in which case their print names
are compared.
- Function: string-lessp string1 string2 ¶
string-lessp
is another name for string<
.
- Function: string-greaterp string1 string2 ¶
This function returns the result of comparing string1 and
string2 in the opposite order, i.e., it is equivalent to calling
(string-lessp string2 string1)
.
- Function: string-collate-lessp string1 string2 &optional locale ignore-case ¶
This function returns t
if string1 is less than
string2 in collation order of the specified locale, which
defaults to your current system locale. A collation order is not only
determined by the lexicographic order of the characters contained in
string1 and string2, but also by further rules about
relations between these characters. Usually, it is defined by the
locale environment with which Emacs is running, and by the Standard C
library against which Emacs was linked.
For example, punctuation and whitespace characters might be ignored
for sorting (see Sequences):
(sort (list "11" "12" "1 1" "1 2" "1.1" "1.2") 'string-collate-lessp)
⇒ ("11" "1 1" "1.1" "12" "1 2" "1.2")
This behavior is system-dependent; e.g., punctuation and whitespace
are never ignored on Cygwin, regardless of locale.
The optional argument locale, a string, overrides the setting of
your current locale identifier for collation. The value is system
dependent; a locale "en_US.UTF-8"
is applicable on POSIX
systems, while it would be, e.g., "enu_USA.1252"
on MS-Windows
systems. The locale value of "POSIX"
or "C"
lets
string-collate-lessp
behave like string-lessp
:
(sort (list "11" "12" "1 1" "1 2" "1.1" "1.2")
(lambda (s1 s2) (string-collate-lessp s1 s2 "POSIX")))
⇒ ("1 1" "1 2" "1.1" "1.2" "11" "12")
If ignore-case is non-nil
, characters are compared
case-insensitively, by converting them to lower-case. However, if the
underlying system library doesn’t provide locale-specific collation
rules, this function falls back to string-lessp
, in which case
the ignore-case argument is ignored, and the comparison will
always be case-sensitive.
To emulate Unicode-compliant collation on MS-Windows systems,
bind w32-collate-ignore-punctuation
to a non-nil
value, since
the codeset part of the locale cannot be "UTF-8"
on MS-Windows.
If your system does not support a locale environment, this function
behaves like string-lessp
.
- Function: string-version-lessp string1 string2 ¶
This function compares strings lexicographically, except it treats
sequences of numerical characters as if they comprised a base-ten
number, and then compares the numbers. So ‘foo2.png’ is
“smaller” than ‘foo12.png’ according to this predicate, even if
‘12’ is lexicographically “smaller” than ‘2’.
- Function: string-prefix-p string1 string2 &optional ignore-case ¶
This function returns non-nil
if string1 is a prefix of
string2; i.e., if string2 starts with string1. If
the optional argument ignore-case is non-nil
, the
comparison ignores case differences.
- Function: string-suffix-p suffix string &optional ignore-case ¶
This function returns non-nil
if suffix is a suffix of
string; i.e., if string ends with suffix. If the
optional argument ignore-case is non-nil
, the comparison
ignores case differences.
- Function: string-search needle haystack &optional start-pos ¶
Return the position of the first instance of needle in
haystack, both of which are strings. If start-pos is
non-nil
, start searching from that position in haystack.
Return nil
if no match was found.
This function only considers the characters in the strings when doing
the comparison; text properties are ignored. Matching is always
case-sensitive.
- Function: compare-strings string1 start1 end1 string2 start2 end2 &optional ignore-case ¶
This function compares a specified part of string1 with a
specified part of string2. The specified part of string1
runs from index start1 (inclusive) up to index end1
(exclusive); nil
for start1 means the start of the
string, while nil
for end1 means the length of the
string. Likewise, the specified part of string2 runs from index
start2 up to index end2.
The strings are compared by the numeric values of their characters.
For instance, str1 is considered less than str2 if
its first differing character has a smaller numeric value. If
ignore-case is non-nil
, characters are converted to
upper-case, using the current buffer’s case-table (see The Case Table), before comparing them. Unibyte strings are converted to
multibyte for comparison (see Text Representations), so that a
unibyte string and its conversion to multibyte are always regarded as
equal.
If the specified portions of the two strings match, the value is
t
. Otherwise, the value is an integer which indicates how many
leading characters agree, and which string is less. Its absolute
value is one plus the number of characters that agree at the beginning
of the two strings. The sign is negative if string1 (or its
specified portion) is less.
- Function: string-distance string1 string2 &optional bytecompare ¶
This function returns the Levenshtein distance between the
source string string1 and the target string string2. The
Levenshtein distance is the number of single-character
changes—deletions, insertions, or replacements—required to
transform the source string into the target string; it is one possible
definition of the edit distance between strings.
Letter-case of the strings is significant for the computed distance,
but their text properties are ignored. If the optional argument
bytecompare is non-nil
, the function calculates the
distance in terms of bytes instead of characters. The byte-wise
comparison uses the internal Emacs representation of characters, so it
will produce inaccurate results for multibyte strings that include raw
bytes (see Text Representations); make the strings unibyte by
encoding them (see Explicit Encoding and Decoding) if you need accurate results
with raw bytes.
- Function: assoc-string key alist &optional case-fold ¶
This function works like assoc
, except that key must be a
string or symbol, and comparison is done using compare-strings
.
Symbols are converted to strings before testing.
If case-fold is non-nil
, key and the elements of
alist are converted to upper-case before comparison.
Unlike assoc
, this function can also match elements of the alist
that are strings or symbols rather than conses. In particular, alist can
be a list of strings or symbols rather than an actual alist.
See Association Lists.
See also the function compare-buffer-substrings
in
Comparing Text, for a way to compare text in buffers. The
function string-match
, which matches a regular expression
against a string, can be used for a kind of string comparison; see
Regular Expression Searching.
4.6 Conversion of Characters and Strings
This section describes functions for converting between characters,
strings and integers. format
(see Formatting Strings) and
prin1-to-string
(see Output Functions) can also convert
Lisp objects into strings. read-from-string
(see Input Functions) can convert a string representation of a Lisp object
into an object. The functions string-to-multibyte
and
string-to-unibyte
convert the text representation of a string
(see Converting Text Representations).
See Documentation, for functions that produce textual descriptions
of text characters and general input events
(single-key-description
and text-char-description
). These
are used primarily for making help messages.
- Function: number-to-string number ¶
-
This function returns a string consisting of the printed base-ten
representation of number. The returned value starts with a
minus sign if the argument is negative.
(number-to-string 256)
⇒ "256"
(number-to-string -23)
⇒ "-23"
(number-to-string -23.5)
⇒ "-23.5"
int-to-string
is a semi-obsolete alias for this function.
See also the function format
in Formatting Strings.
- Function: string-to-number string &optional base ¶
-
This function returns the numeric value of the characters in
string. If base is non-nil
, it must be an integer
between 2 and 16 (inclusive), and integers are converted in that base.
If base is nil
, then base ten is used. Floating-point
conversion only works in base ten; we have not implemented other
radices for floating-point numbers, because that would be much more
work and does not seem useful.
The parsing skips spaces and tabs at the beginning of string,
then reads as much of string as it can interpret as a number in
the given base. (On some systems it ignores other whitespace at the
beginning, not just spaces and tabs.) If string cannot be
interpreted as a number, this function returns 0.
(string-to-number "256")
⇒ 256
(string-to-number "25 is a perfect square.")
⇒ 25
(string-to-number "X256")
⇒ 0
(string-to-number "-4.5")
⇒ -4.5
(string-to-number "1e5")
⇒ 100000.0
string-to-int
is an obsolete alias for this function.
- Function: char-to-string character ¶
-
This function returns a new string containing one character,
character. This function is semi-obsolete because the function
string
is more general. See Creating Strings.
- Function: string-to-char string ¶
This function returns the first character in string. This is
mostly identical to (aref string 0)
, except that it returns 0
if the string is empty. (The value is also 0 when the first character
of string is the null character, ASCII code 0.) This
function may be eliminated in the future if it does not seem useful
enough to retain.
Here are some other functions that can convert to or from a string:
concat
This function converts a vector or a list into a string.
See Creating Strings.
vconcat
This function converts a string into a vector. See Functions for Vectors.
append
This function converts a string into a list. See Building Cons Cells and Lists.
byte-to-string
This function converts a byte of character data into a unibyte string.
See Converting Text Representations.
4.7 Formatting Strings
Formatting means constructing a string by substituting
computed values at various places in a constant string. This constant
string controls how the other values are printed, as well as where
they appear; it is called a format string.
Formatting is often useful for computing messages to be displayed. In
fact, the functions message
and error
provide the same
formatting feature described here; they differ from format-message
only
in how they use the result of formatting.
- Function: format string &rest objects ¶
This function returns a string equal to string, replacing any format
specifications with encodings of the corresponding objects. The
arguments objects are the computed values to be formatted.
The characters in string, other than the format specifications,
are copied directly into the output, including their text properties,
if any. Any text properties of the format specifications are copied
to the produced string representations of the argument objects.
The output string need not be newly-allocated. For example, if
x
is the string "foo"
, the expressions (eq x
(format x))
and (eq x (format "%s" x))
might both yield
t
.
- Function: format-message string &rest objects ¶
-
This function acts like format
, except it also converts any
grave accents (`) and apostrophes (') in string as per the
value of text-quoting-style
.
Typically grave accent and apostrophe in the format translate to
matching curved quotes, e.g., "Missing `%s'" might result in
"Missing ‘foo’". See Text Quoting Style, for how to influence
or inhibit this translation.
A format specification is a sequence of characters beginning with a
‘%’. Thus, if there is a ‘%d’ in string, the
format
function replaces it with the printed representation of
one of the values to be formatted (one of the arguments objects).
For example:
(format "The value of fill-column is %d." fill-column)
⇒ "The value of fill-column is 72."
Since format
interprets ‘%’ characters as format
specifications, you should never pass an arbitrary string as
the first argument. This is particularly true when the string is
generated by some Lisp code. Unless the string is known to
never include any ‘%’ characters, pass "%s"
, described
below, as the first argument, and the string as the second, like this:
(format "%s" arbitrary-string)
Certain format specifications require values of particular types. If
you supply a value that doesn’t fit the requirements, an error is
signaled.
Here is a table of valid format specifications:
- ‘%s’
Replace the specification with the printed representation of the object,
made without quoting (that is, using princ
, not
prin1
—see Output Functions). Thus, strings are represented
by their contents alone, with no ‘"’ characters, and symbols appear
without ‘\’ characters.
If the object is a string, its text properties are
copied into the output. The text properties of the ‘%s’ itself
are also copied, but those of the object take priority.
- ‘%S’
Replace the specification with the printed representation of the object,
made with quoting (that is, using prin1
—see Output Functions). Thus, strings are enclosed in ‘"’ characters, and
‘\’ characters appear where necessary before special characters.
- ‘%o’ ¶
Replace the specification with the base-eight representation of an
integer. Negative integers are formatted in a platform-dependent
way. The object can also be a floating-point number that is formatted
as an integer, dropping any fraction.
- ‘%d’
Replace the specification with the base-ten representation of a signed
integer. The object can also be a floating-point number that is
formatted as an integer, dropping any fraction.
- ‘%x’ ¶
- ‘%X’
Replace the specification with the base-sixteen representation of an
integer. Negative integers are formatted in a platform-dependent
way. ‘%x’ uses lower case and ‘%X’ uses upper
case. The object can also be a floating-point number that is
formatted as an integer, dropping any fraction.
- ‘%c’
Replace the specification with the character which is the value given.
- ‘%e’
Replace the specification with the exponential notation for a
floating-point number.
- ‘%f’
Replace the specification with the decimal-point notation for a
floating-point number.
- ‘%g’
Replace the specification with notation for a floating-point number,
using either exponential notation or decimal-point notation. The
exponential notation is used if the exponent would be less than -4 or
greater than or equal to the precision (default: 6). By default,
trailing zeros are removed from the fractional portion of the result
and a decimal-point character appears only if it is followed by a
digit.
- ‘%%’
Replace the specification with a single ‘%’. This format
specification is unusual in that its only form is plain
‘%%’ and that it does not use a value. For example,
(format "%% %d" 30)
returns "% 30"
.
Any other format character results in an ‘Invalid format
operation’ error.
Here are several examples, which assume the typical
text-quoting-style
settings:
(format "The octal value of %d is %o,
and the hex value is %x." 18 18 18)
⇒ "The octal value of 18 is 22,
and the hex value is 12."
(format-message
"The name of this buffer is ‘%s’." (buffer-name))
⇒ "The name of this buffer is ‘strings.texi’."
(format-message
"The buffer object prints as `%s'." (current-buffer))
⇒ "The buffer object prints as ‘strings.texi’."
By default, format specifications correspond to successive values from
objects. Thus, the first format specification in string
uses the first such value, the second format specification uses the
second such value, and so on. Any extra format specifications (those
for which there are no corresponding values) cause an error. Any
extra values to be formatted are ignored.
A format specification can have a field number, which is a
decimal number immediately after the initial ‘%’, followed by a
literal dollar sign ‘$’. It causes the format specification to
convert the argument with the given number instead of the next
argument. Field numbers start at 1. A format can contain either
numbered or unnumbered format specifications but not both, except that
‘%%’ can be mixed with numbered specifications.
(format "%2$s, %3$s, %%, %1$s" "x" "y" "z")
⇒ "y, z, %, x"
After the ‘%’ and any field number, you can put certain
flag characters.
The flag ‘+’ inserts a plus sign before a nonnegative number, so
that it always has a sign. A space character as flag inserts a space
before a nonnegative number. (Otherwise, nonnegative numbers start with the
first digit.) These flags are useful for ensuring that nonnegative
and negative numbers use the same number of columns. They are
ignored except for ‘%d’, ‘%e’, ‘%f’, ‘%g’, and if
both flags are used, ‘+’ takes precedence.
The flag ‘#’ specifies an alternate form which depends on
the format in use. For ‘%o’, it ensures that the result begins
with a ‘0’. For ‘%x’ and ‘%X’, it prefixes nonzero results
with ‘0x’ or ‘0X’. For ‘%e’ and ‘%f’, the
‘#’ flag means include a decimal point even if the precision is
zero. For ‘%g’, it always includes a decimal point, and also
forces any trailing zeros after the decimal point to be left in place
where they would otherwise be removed.
The flag ‘0’ ensures that the padding consists of ‘0’
characters instead of spaces. This flag is ignored for non-numerical
specification characters like ‘%s’, ‘%S’ and ‘%c’.
These specification characters accept the ‘0’ flag, but still pad
with spaces.
The flag ‘-’ causes any padding inserted by the width,
if specified, to be inserted on the right rather than the left.
If both ‘-’ and ‘0’ are present, the ‘0’ flag is
ignored.
(format "%06d is padded on the left with zeros" 123)
⇒ "000123 is padded on the left with zeros"
(format "'%-6d' is padded on the right" 123)
⇒ "'123 ' is padded on the right"
(format "The word '%-7s' actually has %d letters in it."
"foo" (length "foo"))
⇒ "The word 'foo ' actually has 3 letters in it."
A specification can have a width, which is a decimal number
that appears after any field number and flags. If the printed
representation of the object contains fewer characters than this
width, format
extends it with padding. Any padding introduced by
the width normally consists of spaces inserted on the left:
(format "%5d is padded on the left with spaces" 123)
⇒ " 123 is padded on the left with spaces"
If the width is too small, format
does not truncate the
object’s printed representation. Thus, you can use a width to specify
a minimum spacing between columns with no risk of losing information.
In the following two examples, ‘%7s’ specifies a minimum width
of 7. In the first case, the string inserted in place of ‘%7s’
has only 3 letters, and needs 4 blank spaces as padding. In the
second case, the string "specification"
is 13 letters wide but
is not truncated.
(format "The word '%7s' has %d letters in it."
"foo" (length "foo"))
⇒ "The word ' foo' has 3 letters in it."
(format "The word '%7s' has %d letters in it."
"specification" (length "specification"))
⇒ "The word 'specification' has 13 letters in it."
All the specification characters allow an optional precision
after the field number, flags and width, if present. The precision is
a decimal-point ‘.’ followed by a digit-string. For the
floating-point specifications (‘%e’ and ‘%f’), the
precision specifies how many digits following the decimal point to
show; if zero, the decimal-point itself is also omitted. For
‘%g’, the precision specifies how many significant digits to show
(significant digits are the first digit before the decimal point and
all the digits after it). If the precision of %g is zero or
unspecified, it is treated as 1. For ‘%s’ and ‘%S’, the
precision truncates the string to the given width, so ‘%.3s’
shows only the first three characters of the representation for
object. For other specification characters, the effect of
precision is what the local library functions of the printf
family produce.
If you plan to use read
later on the formatted string to
retrieve a copy of the formatted value, use a specification that lets
read
reconstruct the value. To format numbers in this
reversible way you can use ‘%s’ and ‘%S’, to format just
integers you can also use ‘%d’, and to format just nonnegative
integers you can also use ‘#x%x’ and ‘#o%o’. Other formats
may be problematic; for example, ‘%d’ and ‘%g’ can mishandle
NaNs and can lose precision and type, and ‘#x%x’ and ‘#o%o’
can mishandle negative integers. See Input Functions.
The functions described in this section accept a fixed set of
specification characters. The next section describes a function
format-spec
which can accept custom specification characters,
such as ‘%a’ or ‘%z’.
4.8 Custom Format Strings
Sometimes it is useful to allow users and Lisp programs alike to
control how certain text is generated via custom format control
strings. For example, a format string could control how to display
someone’s forename, surname, and email address. Using the function
format
described in the previous section, the format string
could be something like "%s %s <%s>"
. This approach
quickly becomes impractical, however, as it can be unclear which
specification character corresponds to which piece of information.
A more convenient format string for such cases would be something like
"%f %l <%e>"
, where each specification character carries
more semantic information and can easily be rearranged relative to
other specification characters, making such format strings more easily
customizable by the user.
The function format-spec
described in this section performs a
similar function to format
, except it operates on format
control strings that use arbitrary specification characters.
- Function: format-spec template spec-alist &optional ignore-missing split ¶
This function returns a string produced from the format string
template according to conversions specified in spec-alist,
which is an alist (see Association Lists) of the form
(letter . replacement)
. Each specification
%letter
in template will be replaced by
replacement when formatting the resulting string.
The characters in template, other than the format
specifications, are copied directly into the output, including their
text properties, if any. Any text properties of the format
specifications are copied to their replacements.
Using an alist to specify conversions gives rise to some useful
properties:
- If spec-alist contains more unique letter keys than there
are unique specification characters in template, the unused keys
are simply ignored.
- If spec-alist contains more than one association with the same
letter, the closest one to the start of the list is used.
- If template contains the same specification character more than
once, then the same replacement found in spec-alist is
used as a basis for all of that character’s substitutions.
- The order of specifications in template need not correspond to
the order of associations in spec-alist.
REPLACEMENT can also be a function taking no arguments, and returning
a string to be used for the replacement. It will only be called when
the corresponding LETTER is used in the TEMPLATE. This is useful, for
example, to avoid prompting for input unless it is needed.
The optional argument ignore-missing indicates how to handle
specification characters in template that are not found in
spec-alist. If it is nil
or omitted, the function
signals an error; if it is ignore
, those format specifications
are left verbatim in the output, including their text properties, if
any; if it is delete
, those format specifications are removed
from the output; any other non-nil
value is handled like
ignore
, but any occurrences of ‘%%’ are also left verbatim
in the output.
If the optional argument split is non-nil
, instead of
returning a single string, format-spec
will split the result
into a list of strings, based on where the substitutions were
performed. For instance:
(format-spec "foo %b bar" '((?b . "zot")) nil t)
⇒ ("foo " "zot" " bar")
The syntax of format specifications accepted by format-spec
is
similar, but not identical, to that accepted by format
. In
both cases, a format specification is a sequence of characters
beginning with ‘%’ and ending with an alphabetic letter such as
‘s’.
Unlike format
, which assigns specific meanings to a fixed set
of specification characters, format-spec
accepts arbitrary
specification characters and treats them all equally. For example:
(setq my-site-info
(list (cons ?s system-name)
(cons ?t (symbol-name system-type))
(cons ?c system-configuration)
(cons ?v emacs-version)
(cons ?e invocation-name)
(cons ?p (number-to-string (emacs-pid)))
(cons ?a user-mail-address)
(cons ?n user-full-name)))
(format-spec "%e %v (%c)" my-site-info)
⇒ "emacs 27.1 (x86_64-pc-linux-gnu)"
(format-spec "%n <%a>" my-site-info)
⇒ "Emacs Developers <emacs-devel@gnu.org>"
A format specification can include any number of the following flag
characters immediately after the ‘%’ to modify aspects of the
substitution.
- ‘0’
This flag causes any padding specified by the width to consist of
‘0’ characters instead of spaces.
- ‘-’
This flag causes any padding specified by the width to be inserted on
the right rather than the left.
- ‘<’
This flag causes the substitution to be truncated on the left to the
given width and precision, if specified.
- ‘>’
This flag causes the substitution to be truncated on the right to the
given width and precision, if specified.
- ‘^’
This flag converts the substituted text to upper case (see Case Conversion in Lisp).
- ‘_ (underscore)’
This flag converts the substituted text to lower case (see Case Conversion in Lisp).
The result of using contradictory flags (for instance, both upper and
lower case) is undefined.
As is the case with format
, a format specification can include
a width, which is a decimal number that appears after any flags, and a
precision, which is a decimal-point ‘.’ followed by a decimal
number that appears after any flags and width.
If a substitution contains fewer characters than its specified width,
it is padded on the left:
(format-spec "%8a is padded on the left with spaces"
'((?a . "alpha")))
⇒ " alpha is padded on the left with spaces"
If a substitution contains more characters than its specified
precision, it is truncated on the right:
(format-spec "%.2a is truncated on the right"
'((?a . "alpha")))
⇒ "al is truncated on the right"
Here is a more complicated example that combines several
aforementioned features:
(setq my-battery-info
(list (cons ?p "73") ; Percentage
(cons ?L "Battery") ; Status
(cons ?t "2:23") ; Remaining time
(cons ?c "24330") ; Capacity
(cons ?r "10.6"))) ; Rate of discharge
(format-spec "%>^-3L : %3p%% (%05t left)" my-battery-info)
⇒ "BAT : 73% (02:23 left)"
(format-spec "%>^-3L : %3p%% (%05t left)"
(cons (cons ?L "AC")
my-battery-info))
⇒ "AC : 73% (02:23 left)"
As the examples in this section illustrate, format-spec
is
often used for selectively formatting an assortment of different
pieces of information. This is useful in programs that provide
user-customizable format strings, as the user can choose to format
with a regular syntax and in any desired order only a subset of the
information that the program makes available.
4.9 Case Conversion in Lisp
The character case functions change the case of single characters or
of the contents of strings. The functions normally convert only
alphabetic characters (the letters ‘A’ through ‘Z’ and
‘a’ through ‘z’, as well as non-ASCII letters); other
characters are not altered. You can specify a different case
conversion mapping by specifying a case table (see The Case Table).
These functions do not modify the strings that are passed to them as
arguments.
The examples below use the characters ‘X’ and ‘x’ which have
ASCII codes 88 and 120 respectively.
- Function: downcase string-or-char ¶
This function converts string-or-char, which should be either a
character or a string, to lower case.
When string-or-char is a string, this function returns a new
string in which each letter in the argument that is upper case is
converted to lower case. When string-or-char is a character,
this function returns the corresponding lower case character (an
integer); if the original character is lower case, or is not a letter,
the return value is equal to the original character.
(downcase "The cat in the hat")
⇒ "the cat in the hat"
(downcase ?X)
⇒ 120
- Function: upcase string-or-char ¶
This function converts string-or-char, which should be either a
character or a string, to upper case.
When string-or-char is a string, this function returns a new
string in which each letter in the argument that is lower case is
converted to upper case. When string-or-char is a character,
this function returns the corresponding upper case character (an
integer); if the original character is upper case, or is not a letter,
the return value is equal to the original character.
(upcase "The cat in the hat")
⇒ "THE CAT IN THE HAT"
(upcase ?x)
⇒ 88
- Function: capitalize string-or-char ¶
-
This function capitalizes strings or characters. If
string-or-char is a string, the function returns a new string
whose contents are a copy of string-or-char in which each word
has been capitalized. This means that the first character of each
word is converted to upper case, and the rest are converted to lower
case.
The definition of a word is any sequence of consecutive characters that
are assigned to the word constituent syntax class in the current syntax
table (see Table of Syntax Classes).
When string-or-char is a character, this function does the same
thing as upcase
.
(capitalize "The cat in the hat")
⇒ "The Cat In The Hat"
(capitalize "THE 77TH-HATTED CAT")
⇒ "The 77th-Hatted Cat"
(capitalize ?x)
⇒ 88
- Function: upcase-initials string-or-char ¶
If string-or-char is a string, this function capitalizes the
initials of the words in string-or-char, without altering any
letters other than the initials. It returns a new string whose
contents are a copy of string-or-char, in which each word has
had its initial letter converted to upper case.
The definition of a word is any sequence of consecutive characters that
are assigned to the word constituent syntax class in the current syntax
table (see Table of Syntax Classes).
When the argument to upcase-initials
is a character,
upcase-initials
has the same result as upcase
.
(upcase-initials "The CAT in the hAt")
⇒ "The CAT In The HAt"
Note that case conversion is not a one-to-one mapping of codepoints
and length of the result may differ from length of the argument.
Furthermore, because passing a character forces return type to be
a character, functions are unable to perform proper substitution and
result may differ compared to treating a one-character string. For
example:
(upcase "fi") ; note: single character, ligature "fi"
⇒ "FI"
(upcase ?fi)
⇒ 64257 ; i.e. ?fi
To avoid this, a character must first be converted into a string,
using string
function, before being passed to one of the casing
functions. Of course, no assumptions on the length of the result may
be made.
Mapping for such special cases are taken from
special-uppercase
, special-lowercase
and
special-titlecase
See Character Properties.
See Comparison of Characters and Strings, for functions that compare strings; some of
them ignore case differences, or can optionally ignore case differences.
4.10 The Case Table
You can customize case conversion by installing a special case
table. A case table specifies the mapping between upper case and lower
case letters. It affects both the case conversion functions for Lisp
objects (see the previous section) and those that apply to text in the
buffer (see Case Changes). Each buffer has a case table; there is
also a standard case table which is used to initialize the case table
of new buffers.
A case table is a char-table (see Char-Tables) whose subtype is
case-table
. This char-table maps each character into the
corresponding lower case character. It has three extra slots, which
hold related tables:
- upcase
The upcase table maps each character into the corresponding upper
case character.
- canonicalize
The canonicalize table maps all of a set of case-related characters
into a particular member of that set.
- equivalences
The equivalences table maps each one of a set of case-related characters
into the next character in that set.
In simple cases, all you need to specify is the mapping to lower-case;
the three related tables will be calculated automatically from that one.
For some languages, upper and lower case letters are not in one-to-one
correspondence. There may be two different lower case letters with the
same upper case equivalent. In these cases, you need to specify the
maps for both lower case and upper case.
The extra table canonicalize maps each character to a canonical
equivalent; any two characters that are related by case-conversion have
the same canonical equivalent character. For example, since ‘a’
and ‘A’ are related by case-conversion, they should have the same
canonical equivalent character (which should be either ‘a’ for both
of them, or ‘A’ for both of them).
The extra table equivalences is a map that cyclically permutes
each equivalence class (of characters with the same canonical
equivalent). (For ordinary ASCII, this would map ‘a’ into
‘A’ and ‘A’ into ‘a’, and likewise for each set of
equivalent characters.)
When constructing a case table, you can provide nil
for
canonicalize; then Emacs fills in this slot from the lower case
and upper case mappings. You can also provide nil
for
equivalences; then Emacs fills in this slot from
canonicalize. In a case table that is actually in use, those
components are non-nil
. Do not try to specify
equivalences without also specifying canonicalize.
Here are the functions for working with case tables:
- Function: case-table-p object ¶
This predicate returns non-nil
if object is a valid case
table.
- Function: set-standard-case-table table ¶
This function makes table the standard case table, so that it will
be used in any buffers created subsequently.
- Function: standard-case-table ¶
This returns the standard case table.
- Function: current-case-table ¶
This function returns the current buffer’s case table.
- Function: set-case-table table ¶
This sets the current buffer’s case table to table.
- Macro: with-case-table table body… ¶
The with-case-table
macro saves the current case table, makes
table the current case table, evaluates the body forms,
and finally restores the case table. The return value is the value of
the last form in body. The case table is restored even in case
of an abnormal exit via throw
or error (see Nonlocal Exits).
Some language environments modify the case conversions of
ASCII characters; for example, in the Turkish language
environment, the ASCII capital I is downcased into
a Turkish dotless i (‘ı’). This can interfere with code that requires
ordinary ASCII case conversion, such as implementations of
ASCII-based network protocols. In that case, use the
with-case-table
macro with the variable ascii-case-table,
which stores the unmodified case table for the ASCII
character set.
- Variable: ascii-case-table ¶
The case table for the ASCII character set. This should not be
modified by any language environment settings.
The following three functions are convenient subroutines for packages
that define non-ASCII character sets. They modify the specified
case table case-table; they also modify the standard syntax table.
See Syntax Tables. Normally you would use these functions to change
the standard case table.
- Function: set-case-syntax-pair uc lc case-table ¶
This function specifies a pair of corresponding letters, one upper case
and one lower case.
- Function: set-case-syntax-delims l r case-table ¶
This function makes characters l and r a matching pair of
case-invariant delimiters.
- Function: set-case-syntax char syntax case-table ¶
This function makes char case-invariant, with syntax
syntax.
- Command: describe-buffer-case-table ¶
This command displays a description of the contents of the current
buffer’s case table.
5 Lists
A list represents a sequence of zero or more elements (which may
be any Lisp objects). The important difference between lists and
vectors is that two or more lists can share part of their structure; in
addition, you can insert or delete elements in a list without copying
the whole list.
5.1 Lists and Cons Cells
Lists in Lisp are not a primitive data type; they are built up from
cons cells (see Cons Cell and List Types). A cons cell is a data
object that represents an ordered pair. That is, it has two slots,
and each slot holds, or refers to, some Lisp object. One
slot is known as the CAR, and the other is known as the CDR.
(These names are traditional; see Cons Cell and List Types.) CDR is
pronounced “could-er”.
We say that “the CAR of this cons cell is” whatever object
its CAR slot currently holds, and likewise for the CDR.
A list is a series of cons cells chained together, so that each
cell refers to the next one. There is one cons cell for each element
of the list. By convention, the CARs of the cons cells hold the
elements of the list, and the CDRs are used to chain the list
(this asymmetry between CAR and CDR is entirely a matter of
convention; at the level of cons cells, the CAR and CDR
slots have similar properties). Hence, the CDR slot of each cons
cell in a list refers to the following cons cell.
Also by convention, the CDR of the last cons cell in a list is
nil
. We call such a nil
-terminated structure a
proper list4. In Emacs Lisp, the symbol nil
is both a symbol and a
list with no elements. For convenience, the symbol nil
is
considered to have nil
as its CDR (and also as its
CAR).
Hence, the CDR of a proper list is always a proper list. The
CDR of a nonempty proper list is a proper list containing all the
elements except the first.
If the CDR of a list’s last cons cell is some value other than
nil
, we call the structure a dotted list, since its
printed representation would use dotted pair notation (see Dotted Pair Notation). There is one other possibility: some cons cell’s
CDR could point to one of the previous cons cells in the list.
We call that structure a circular list.
For some purposes, it does not matter whether a list is proper,
circular or dotted. If a program doesn’t look far enough down the
list to see the CDR of the final cons cell, it won’t care.
However, some functions that operate on lists demand proper lists and
signal errors if given a dotted list. Most functions that try to find
the end of a list enter infinite loops if given a circular list. You
can use the function proper-list-p
, described in the next
section (see proper-list-p), to determine
whether a list is a proper one.
Because most cons cells are used as part of lists, we refer to any
structure made out of cons cells as a list structure.
5.3 Accessing Elements of Lists
- Function: car cons-cell ¶
This function returns the value referred to by the first slot of the
cons cell cons-cell. In other words, it returns the CAR of
cons-cell.
As a special case, if cons-cell is nil
, this function
returns nil
. Therefore, any list is a valid argument. An
error is signaled if the argument is not a cons cell or nil
.
(car '(a b c))
⇒ a
(car '())
⇒ nil
- Function: cdr cons-cell ¶
This function returns the value referred to by the second slot of the
cons cell cons-cell. In other words, it returns the CDR of
cons-cell.
As a special case, if cons-cell is nil
, this function
returns nil
; therefore, any list is a valid argument. An error
is signaled if the argument is not a cons cell or nil
.
(cdr '(a b c))
⇒ (b c)
(cdr '())
⇒ nil
- Function: car-safe object ¶
This function lets you take the CAR of a cons cell while avoiding
errors for other data types. It returns the CAR of object if
object is a cons cell, nil
otherwise. This is in contrast
to car
, which signals an error if object is not a list.
(car-safe object)
≡
(let ((x object))
(if (consp x)
(car x)
nil))
- Function: cdr-safe object ¶
This function lets you take the CDR of a cons cell while
avoiding errors for other data types. It returns the CDR of
object if object is a cons cell, nil
otherwise.
This is in contrast to cdr
, which signals an error if
object is not a list.
(cdr-safe object)
≡
(let ((x object))
(if (consp x)
(cdr x)
nil))
- Macro: pop listname ¶
This macro provides a convenient way to examine the CAR of a
list, and take it off the list, all at once. It operates on the list
stored in listname. It removes the first element from the list,
saves the CDR into listname, then returns the removed
element.
In the simplest case, listname is an unquoted symbol naming a
list; in that case, this macro is equivalent to (prog1 (car listname) (setq listname (cdr listname)))
.
x
⇒ (a b c)
(pop x)
⇒ a
x
⇒ (b c)
More generally, listname can be a generalized variable. In that
case, this macro saves into listname using setf
.
See Generalized Variables.
For the push
macro, which adds an element to a list,
See Modifying List Variables.
- Function: nth n list ¶
This function returns the nth element of list. Elements
are numbered starting with zero, so the CAR of list is
element number zero. If the length of list is n or less,
the value is nil
.
(nth 2 '(1 2 3 4))
⇒ 3
(nth 10 '(1 2 3 4))
⇒ nil
(nth n x) ≡ (car (nthcdr n x))
The function elt
is similar, but applies to any kind of sequence.
For historical reasons, it takes its arguments in the opposite order.
See Sequences.
- Function: nthcdr n list ¶
This function returns the nth CDR of list. In other
words, it skips past the first n links of list and returns
what follows.
If n is zero, nthcdr
returns all of
list. If the length of list is n or less,
nthcdr
returns nil
.
(nthcdr 1 '(1 2 3 4))
⇒ (2 3 4)
(nthcdr 10 '(1 2 3 4))
⇒ nil
(nthcdr 0 '(1 2 3 4))
⇒ (1 2 3 4)
- Function: take n list ¶
This function returns the n first elements of list. Essentially,
it returns the part of list that nthcdr
skips.
take
returns list if shorter than n elements;
it returns nil
if n is zero or negative.
(take 3 '(a b c d))
⇒ (a b c)
(take 10 '(a b c d))
⇒ (a b c d)
(take 0 '(a b c d))
⇒ nil
- Function: ntake n list ¶
This is a version of take
that works by destructively modifying
the list structure of the argument. That makes it faster, but the
original value of list may be lost.
ntake
returns list unmodified if shorter than n
elements; it returns nil
if n is zero or negative.
Otherwise, it returns list truncated to its first n
elements.
This means that it is usually a good idea to use the return value and
not just rely on the truncation effect unless n is known to be
positive.
- Function: last list &optional n ¶
This function returns the last link of list. The car
of
this link is the list’s last element. If list is null,
nil
is returned. If n is non-nil
, the
nth-to-last link is returned instead, or the whole of list
if n is bigger than list’s length.
- Function: safe-length list ¶
This function returns the length of list, with no risk of either
an error or an infinite loop. It generally returns the number of
distinct cons cells in the list. However, for circular lists,
the value is just an upper bound; it is often too large.
If list is not nil
or a cons cell, safe-length
returns 0.
The most common way to compute the length of a list, when you are not
worried that it may be circular, is with length
. See Sequences.
- Function: caar cons-cell ¶
This is the same as (car (car cons-cell))
.
- Function: cadr cons-cell ¶
This is the same as (car (cdr cons-cell))
or (nth 1 cons-cell)
.
- Function: cdar cons-cell ¶
This is the same as (cdr (car cons-cell))
.
- Function: cddr cons-cell ¶
This is the same as (cdr (cdr cons-cell))
or (nthcdr 2 cons-cell)
.
In addition to the above, 24 additional compositions of car
and
cdr
are defined as cxxxr
and cxxxxr
,
where each x
is either a
or d
. cadr
,
caddr
, and cadddr
pick out the second, third or fourth
elements of a list, respectively. cl-lib provides the same
under the names cl-second
, cl-third
, and
cl-fourth
. See List Functions in Common Lisp
Extensions.
- Function: butlast x &optional n ¶
This function returns the list x with the last element,
or the last n elements, removed. If n is greater
than zero it makes a copy of the list so as not to damage the
original list. In general, (append (butlast x n)
(last x n))
will return a list equal to x.
- Function: nbutlast x &optional n ¶
This is a version of butlast
that works by destructively
modifying the cdr
of the appropriate element, rather than
making a copy of the list.
5.4 Building Cons Cells and Lists
Many functions build lists, as lists reside at the very heart of Lisp.
cons
is the fundamental list-building function; however, it is
interesting to note that list
is used more times in the source
code for Emacs than cons
.
- Function: cons object1 object2 ¶
This function is the most basic function for building new list
structure. It creates a new cons cell, making object1 the
CAR, and object2 the CDR. It then returns the new
cons cell. The arguments object1 and object2 may be any
Lisp objects, but most often object2 is a list.
(cons 1 '(2))
⇒ (1 2)
(cons 1 '())
⇒ (1)
(cons 1 2)
⇒ (1 . 2)
cons
is often used to add a single element to the front of a
list. This is called consing the element onto the list.
5
For example:
(setq list (cons newelt list))
Note that there is no conflict between the variable named list
used in this example and the function named list
described below;
any symbol can serve both purposes.
- Function: list &rest objects ¶
This function creates a list with objects as its elements. The
resulting list is always nil
-terminated. If no objects
are given, the empty list is returned.
(list 1 2 3 4 5)
⇒ (1 2 3 4 5)
(list 1 2 '(3 4 5) 'foo)
⇒ (1 2 (3 4 5) foo)
(list)
⇒ nil
- Function: make-list length object ¶
This function creates a list of length elements, in which each
element is object. Compare make-list
with
make-string
(see Creating Strings).
(make-list 3 'pigs)
⇒ (pigs pigs pigs)
(make-list 0 'pigs)
⇒ nil
(setq l (make-list 3 '(a b)))
⇒ ((a b) (a b) (a b))
(eq (car l) (cadr l))
⇒ t
- Function: append &rest sequences ¶
-
This function returns a list containing all the elements of
sequences. The sequences may be lists, vectors,
bool-vectors, or strings, but the last one should usually be a list.
All arguments except the last one are copied, so none of the arguments
is altered. (See nconc
in Functions that Rearrange Lists, for a way to join
lists with no copying.)
More generally, the final argument to append
may be any Lisp
object. The final argument is not copied or converted; it becomes the
CDR of the last cons cell in the new list. If the final argument
is itself a list, then its elements become in effect elements of the
result list. If the final element is not a list, the result is a
dotted list since its final CDR is not nil
as required
in a proper list (see Lists and Cons Cells).
Here is an example of using append
:
(setq trees '(pine oak))
⇒ (pine oak)
(setq more-trees (append '(maple birch) trees))
⇒ (maple birch pine oak)
trees
⇒ (pine oak)
more-trees
⇒ (maple birch pine oak)
(eq trees (cdr (cdr more-trees)))
⇒ t
You can see how append
works by looking at a box diagram. The
variable trees
is set to the list (pine oak)
and then the
variable more-trees
is set to the list (maple birch pine
oak)
. However, the variable trees
continues to refer to the
original list:
more-trees trees
| |
| --- --- --- --- -> --- --- --- ---
--> | | |--> | | |--> | | |--> | | |--> nil
--- --- --- --- --- --- --- ---
| | | |
| | | |
--> maple -->birch --> pine --> oak
An empty sequence contributes nothing to the value returned by
append
. As a consequence of this, a final nil
argument
forces a copy of the previous argument:
trees
⇒ (pine oak)
(setq wood (append trees nil))
⇒ (pine oak)
wood
⇒ (pine oak)
(eq wood trees)
⇒ nil
This once was the usual way to copy a list, before the function
copy-sequence
was invented. See Sequences, Arrays, and Vectors.
Here we show the use of vectors and strings as arguments to append
:
(append [a b] "cd" nil)
⇒ (a b 99 100)
With the help of apply
(see Calling Functions), we can append
all the lists in a list of lists:
(apply 'append '((a b c) nil (x y z) nil))
⇒ (a b c x y z)
If no sequences are given, nil
is returned:
Here are some examples where the final argument is not a list:
(append '(x y) 'z)
⇒ (x y . z)
(append '(x y) [z])
⇒ (x y . [z])
The second example shows that when the final argument is a sequence but
not a list, the sequence’s elements do not become elements of the
resulting list. Instead, the sequence becomes the final CDR, like
any other non-list final argument.
- Function: copy-tree tree &optional vecp ¶
This function returns a copy of the tree tree. If tree is a
cons cell, this makes a new cons cell with the same CAR and
CDR, then recursively copies the CAR and CDR in the
same way.
Normally, when tree is anything other than a cons cell,
copy-tree
simply returns tree. However, if vecp is
non-nil
, it copies vectors too (and operates recursively on
their elements).
- Function: flatten-tree tree ¶
This function returns a “flattened” copy of tree, that is,
a list containing all the non-nil
terminal nodes, or leaves, of
the tree of cons cells rooted at tree. Leaves in the returned
list are in the same order as in tree.
(flatten-tree '(1 (2 . 3) nil (4 5 (6)) 7))
⇒(1 2 3 4 5 6 7)
- Function: ensure-list object ¶
This function returns object as a list. If object is
already a list, the function returns it; otherwise, the function
returns a one-element list containing object.
This is usually useful if you have a variable that may or may not be a
list, and you can then say, for instance:
(dolist (elem (ensure-list foo))
(princ elem))
- Function: number-sequence from &optional to separation ¶
This function returns a list of numbers starting with from and
incrementing by separation, and ending at or just before
to. separation can be positive or negative and defaults
to 1. If to is nil
or numerically equal to from,
the value is the one-element list (from)
. If to is
less than from with a positive separation, or greater than
from with a negative separation, the value is nil
because those arguments specify an empty sequence.
If separation is 0 and to is neither nil
nor
numerically equal to from, number-sequence
signals an
error, since those arguments specify an infinite sequence.
All arguments are numbers.
Floating-point arguments can be tricky, because floating-point
arithmetic is inexact. For instance, depending on the machine, it may
quite well happen that (number-sequence 0.4 0.6 0.2)
returns
the one element list (0.4)
, whereas
(number-sequence 0.4 0.8 0.2)
returns a list with three
elements. The nth element of the list is computed by the exact
formula (+ from (* n separation))
. Thus, if
one wants to make sure that to is included in the list, one can
pass an expression of this exact type for to. Alternatively,
one can replace to with a slightly larger value (or a slightly
more negative value if separation is negative).
Some examples:
(number-sequence 4 9)
⇒ (4 5 6 7 8 9)
(number-sequence 9 4 -1)
⇒ (9 8 7 6 5 4)
(number-sequence 9 4 -2)
⇒ (9 7 5)
(number-sequence 8)
⇒ (8)
(number-sequence 8 5)
⇒ nil
(number-sequence 5 8 -1)
⇒ nil
(number-sequence 1.5 6 2)
⇒ (1.5 3.5 5.5)
5.5 Modifying List Variables
These functions, and one macro, provide convenient ways
to modify a list which is stored in a variable.
- Macro: push element listname ¶
This macro creates a new list whose CAR is element and
whose CDR is the list specified by listname, and saves that
list in listname. In the simplest case, listname is an
unquoted symbol naming a list, and this macro is equivalent
to (setq listname (cons element listname))
.
(setq l '(a b))
⇒ (a b)
(push 'c l)
⇒ (c a b)
l
⇒ (c a b)
More generally, listname
can be a generalized variable. In
that case, this macro does the equivalent of (setf listname (cons element listname))
.
See Generalized Variables.
For the pop
macro, which removes the first element from a list,
See Accessing Elements of Lists.
Two functions modify lists that are the values of variables.
- Function: add-to-list symbol element &optional append compare-fn ¶
This function sets the variable symbol by consing element
onto the old value, if element is not already a member of that
value. It returns the resulting list, whether updated or not. The
value of symbol had better be a list already before the call.
add-to-list
uses compare-fn to compare element
against existing list members; if compare-fn is nil
, it
uses equal
.
Normally, if element is added, it is added to the front of
symbol, but if the optional argument append is
non-nil
, it is added at the end.
The argument symbol is not implicitly quoted; add-to-list
is an ordinary function, like set
and unlike setq
. Quote
the argument yourself if that is what you want.
Do not use this function when symbol refers to a lexical
variable.
Here’s a scenario showing how to use add-to-list
:
(setq foo '(a b))
⇒ (a b)
(add-to-list 'foo 'c) ;; Add c
.
⇒ (c a b)
(add-to-list 'foo 'b) ;; No effect.
⇒ (c a b)
foo ;; foo
was changed.
⇒ (c a b)
An equivalent expression for (add-to-list 'var
value)
is this:
(if (member value var)
var
(setq var (cons value var)))
- Function: add-to-ordered-list symbol element &optional order ¶
This function sets the variable symbol by inserting
element into the old value, which must be a list, at the
position specified by order. If element is already a
member of the list, its position in the list is adjusted according
to order. Membership is tested using eq
.
This function returns the resulting list, whether updated or not.
The order is typically a number (integer or float), and the
elements of the list are sorted in non-decreasing numerical order.
order may also be omitted or nil
. Then the numeric order
of element stays unchanged if it already has one; otherwise,
element has no numeric order. Elements without a numeric list
order are placed at the end of the list, in no particular order.
Any other value for order removes the numeric order of element
if it already has one; otherwise, it is equivalent to nil
.
The argument symbol is not implicitly quoted;
add-to-ordered-list
is an ordinary function, like set
and unlike setq
. Quote the argument yourself if necessary.
The ordering information is stored in a hash table on symbol’s
list-order
property.
symbol cannot refer to a lexical variable.
Here’s a scenario showing how to use add-to-ordered-list
:
(setq foo '())
⇒ nil
(add-to-ordered-list 'foo 'a 1) ;; Add a
.
⇒ (a)
(add-to-ordered-list 'foo 'c 3) ;; Add c
.
⇒ (a c)
(add-to-ordered-list 'foo 'b 2) ;; Add b
.
⇒ (a b c)
(add-to-ordered-list 'foo 'b 4) ;; Move b
.
⇒ (a c b)
(add-to-ordered-list 'foo 'd) ;; Append d
.
⇒ (a c b d)
(add-to-ordered-list 'foo 'e) ;; Add e
.
⇒ (a c b e d)
foo ;; foo
was changed.
⇒ (a c b e d)
5.6 Modifying Existing List Structure
You can modify the CAR and CDR contents of a cons cell with the
primitives setcar
and setcdr
. These are destructive
operations because they change existing list structure.
Destructive operations should be applied only to mutable lists,
that is, lists constructed via cons
, list
or similar
operations. Lists created by quoting are part of the program and
should not be changed by destructive operations. See Mutability.
Common Lisp note: Common Lisp uses functions rplaca
and
rplacd
to alter list structure; they change structure the same
way as setcar
and setcdr
, but the Common Lisp functions
return the cons cell while setcar
and setcdr
return the
new CAR or CDR.
5.6.1 Altering List Elements with setcar
Changing the CAR of a cons cell is done with setcar
. When
used on a list, setcar
replaces one element of a list with a
different element.
- Function: setcar cons object ¶
This function stores object as the new CAR of cons,
replacing its previous CAR. In other words, it changes the
CAR slot of cons to refer to object. It returns the
value object. For example:
(setq x (list 1 2))
⇒ (1 2)
(setcar x 4)
⇒ 4
x
⇒ (4 2)
When a cons cell is part of the shared structure of several lists,
storing a new CAR into the cons changes one element of each of
these lists. Here is an example:
;; Create two lists that are partly shared.
(setq x1 (list 'a 'b 'c))
⇒ (a b c)
(setq x2 (cons 'z (cdr x1)))
⇒ (z b c)
;; Replace the CAR of a shared link.
(setcar (cdr x1) 'foo)
⇒ foo
x1 ; Both lists are changed.
⇒ (a foo c)
x2
⇒ (z foo c)
;; Replace the CAR of a link that is not shared.
(setcar x1 'baz)
⇒ baz
x1 ; Only one list is changed.
⇒ (baz foo c)
x2
⇒ (z foo c)
Here is a graphical depiction of the shared structure of the two lists
in the variables x1
and x2
, showing why replacing b
changes them both:
--- --- --- --- --- ---
x1---> | | |----> | | |--> | | |--> nil
--- --- --- --- --- ---
| --> | |
| | | |
--> a | --> b --> c
|
--- --- |
x2--> | | |--
--- ---
|
|
--> z
Here is an alternative form of box diagram, showing the same relationship:
x1:
-------------- -------------- --------------
| car | cdr | | car | cdr | | car | cdr |
| a | o------->| b | o------->| c | nil |
| | | -->| | | | | |
-------------- | -------------- --------------
|
x2: |
-------------- |
| car | cdr | |
| z | o----
| | |
--------------
5.6.2 Altering the CDR of a List
The lowest-level primitive for modifying a CDR is setcdr
:
- Function: setcdr cons object ¶
This function stores object as the new CDR of cons,
replacing its previous CDR. In other words, it changes the
CDR slot of cons to refer to object. It returns the
value object.
Here is an example of replacing the CDR of a list with a
different list. All but the first element of the list are removed in
favor of a different sequence of elements. The first element is
unchanged, because it resides in the CAR of the list, and is not
reached via the CDR.
(setq x (list 1 2 3))
⇒ (1 2 3)
(setcdr x '(4))
⇒ (4)
x
⇒ (1 4)
You can delete elements from the middle of a list by altering the
CDRs of the cons cells in the list. For example, here we delete
the second element, b
, from the list (a b c)
, by changing
the CDR of the first cons cell:
(setq x1 (list 'a 'b 'c))
⇒ (a b c)
(setcdr x1 (cdr (cdr x1)))
⇒ (c)
x1
⇒ (a c)
Here is the result in box notation:
--------------------
| |
-------------- | -------------- | --------------
| car | cdr | | | car | cdr | -->| car | cdr |
| a | o----- | b | o-------->| c | nil |
| | | | | | | | |
-------------- -------------- --------------
The second cons cell, which previously held the element b
, still
exists and its CAR is still b
, but it no longer forms part
of this list.
It is equally easy to insert a new element by changing CDRs:
(setq x1 (list 'a 'b 'c))
⇒ (a b c)
(setcdr x1 (cons 'd (cdr x1)))
⇒ (d b c)
x1
⇒ (a d b c)
Here is this result in box notation:
-------------- ------------- -------------
| car | cdr | | car | cdr | | car | cdr |
| a | o | -->| b | o------->| c | nil |
| | | | | | | | | | |
--------- | -- | ------------- -------------
| |
----- --------
| |
| --------------- |
| | car | cdr | |
-->| d | o------
| | |
---------------
5.6.3 Functions that Rearrange Lists
Here are some functions that rearrange lists destructively by
modifying the CDRs of their component cons cells. These functions
are destructive because they chew up the original lists passed
to them as arguments, relinking their cons cells to form a new list that
is the returned value.
See delq
, in Using Lists as Sets, for another function
that modifies cons cells.
- Function: nconc &rest lists ¶
-
This function returns a list containing all the elements of lists.
Unlike append
(see Building Cons Cells and Lists), the lists are
not copied. Instead, the last CDR of each of the
lists is changed to refer to the following list. The last of the
lists is not altered. For example:
(setq x (list 1 2 3))
⇒ (1 2 3)
(nconc x '(4 5))
⇒ (1 2 3 4 5)
x
⇒ (1 2 3 4 5)
Since the last argument of nconc
is not itself modified, it is
reasonable to use a constant list, such as '(4 5)
, as in the
above example. For the same reason, the last argument need not be a
list:
(setq x (list 1 2 3))
⇒ (1 2 3)
(nconc x 'z)
⇒ (1 2 3 . z)
x
⇒ (1 2 3 . z)
However, the other arguments (all but the last) should be mutable
lists.
A common pitfall is to use a constant list as a non-last argument to
nconc
. If you do this, the resulting behavior is undefined
(see Self-Evaluating Forms). It is possible that your program
will change each time you run it! Here is what might happen (though
this is not guaranteed to happen):
(defun add-foo (x) ; We want this function to add
(nconc '(foo) x)) ; foo
to the front of its arg.
(symbol-function 'add-foo)
⇒ (lambda (x) (nconc '(foo) x))
(setq xx (add-foo '(1 2))) ; It seems to work.
⇒ (foo 1 2)
(setq xy (add-foo '(3 4))) ; What happened?
⇒ (foo 1 2 3 4)
(eq xx xy)
⇒ t
(symbol-function 'add-foo)
⇒ (lambda (x) (nconc '(foo 1 2 3 4) x))
5.7 Using Lists as Sets
A list can represent an unordered mathematical set—simply consider
a value an element of a set if it appears in the list, and ignore the
order of the list. To form the union of two sets, use append
(as long as you don’t mind having duplicate elements). You can remove
equal
duplicates using delete-dups
or seq-uniq
.
Other useful functions for sets include memq
and delq
,
and their equal
versions, member
and delete
.
Common Lisp note: Common Lisp has functions union
(which
avoids duplicate elements) and intersection
for set operations.
In Emacs Lisp, variants of these facilities are provided by the
cl-lib library. See Lists as Sets in Common Lisp Extensions.
- Function: memq object list ¶
-
This function tests to see whether object is a member of
list. If it is, memq
returns a list starting with the
first occurrence of object. Otherwise, it returns nil
.
The letter ‘q’ in memq
says that it uses eq
to
compare object against the elements of the list. For example:
(memq 'b '(a b c b a))
⇒ (b c b a)
(memq '(2) '((1) (2))) ; The two (2)
s need not be eq
.
⇒ Unspecified; might be nil
or ((2))
.
- Function: delq object list ¶
-
This function destructively removes all elements eq
to
object from list, and returns the resulting list. The
letter ‘q’ in delq
says that it uses eq
to compare
object against the elements of the list, like memq
and
remq
.
Typically, when you invoke delq
, you should use the return
value by assigning it to the variable which held the original list.
The reason for this is explained below.
The delq
function deletes elements from the front of the list
by simply advancing down the list, and returning a sublist that starts
after those elements. For example:
(delq 'a '(a b c)) ≡ (cdr '(a b c))
When an element to be deleted appears in the middle of the list,
removing it involves changing the CDRs (see Altering the CDR of a List).
(setq sample-list (list 'a 'b 'c '(4)))
⇒ (a b c (4))
(delq 'a sample-list)
⇒ (b c (4))
sample-list
⇒ (a b c (4))
(delq 'c sample-list)
⇒ (a b (4))
sample-list
⇒ (a b (4))
Note that (delq 'c sample-list)
modifies sample-list
to
splice out the third element, but (delq 'a sample-list)
does not
splice anything—it just returns a shorter list. Don’t assume that a
variable which formerly held the argument list now has fewer
elements, or that it still holds the original list! Instead, save the
result of delq
and use that. Most often we store the result back
into the variable that held the original list:
(setq flowers (delq 'rose flowers))
In the following example, the (list 4)
that delq
attempts to match
and the (4)
in the sample-list
are equal
but not eq
:
(delq (list 4) sample-list)
⇒ (a c (4))
If you want to delete elements that are equal
to a given value,
use delete
(see below).
- Function: remq object list ¶
This function returns a copy of list, with all elements removed
which are eq
to object. The letter ‘q’ in remq
says that it uses eq
to compare object against the elements
of list
.
(setq sample-list (list 'a 'b 'c 'a 'b 'c))
⇒ (a b c a b c)
(remq 'a sample-list)
⇒ (b c b c)
sample-list
⇒ (a b c a b c)
- Function: memql object list ¶
The function memql
tests to see whether object is a member
of list, comparing members with object using eql
,
so floating-point elements are compared by value.
If object is a member, memql
returns a list starting with
its first occurrence in list. Otherwise, it returns nil
.
Compare this with memq
:
(memql 1.2 '(1.1 1.2 1.3)) ; 1.2
and 1.2
are eql
.
⇒ (1.2 1.3)
(memq 1.2 '(1.1 1.2 1.3)) ; The two 1.2
s need not be eq
.
⇒ Unspecified; might be nil
or (1.2 1.3)
.
The following three functions are like memq
, delq
and
remq
, but use equal
rather than eq
to compare
elements. See Equality Predicates.
- Function: member object list ¶
The function member
tests to see whether object is a member
of list, comparing members with object using equal
.
If object is a member, member
returns a list starting with
its first occurrence in list. Otherwise, it returns nil
.
Compare this with memq
:
(member '(2) '((1) (2))) ; (2)
and (2)
are equal
.
⇒ ((2))
(memq '(2) '((1) (2))) ; The two (2)
s need not be eq
.
⇒ Unspecified; might be nil
or (2)
.
;; Two strings with the same contents are equal
.
(member "foo" '("foo" "bar"))
⇒ ("foo" "bar")
- Function: delete object sequence ¶
This function removes all elements equal
to object from
sequence, and returns the resulting sequence.
If sequence is a list, delete
is to delq
as
member
is to memq
: it uses equal
to compare
elements with object, like member
; when it finds an
element that matches, it cuts the element out just as delq
would. As with delq
, you should typically use the return value
by assigning it to the variable which held the original list.
If sequence
is a vector or string, delete
returns a copy
of sequence
with all elements equal
to object
removed.
For example:
(setq l (list '(2) '(1) '(2)))
(delete '(2) l)
⇒ ((1))
l
⇒ ((2) (1))
;; If you want to change l
reliably,
;; write (setq l (delete '(2) l))
.
(setq l (list '(2) '(1) '(2)))
(delete '(1) l)
⇒ ((2) (2))
l
⇒ ((2) (2))
;; In this case, it makes no difference whether you set l
,
;; but you should do so for the sake of the other case.
(delete '(2) [(2) (1) (2)])
⇒ [(1)]
- Function: remove object sequence ¶
This function is the non-destructive counterpart of delete
. It
returns a copy of sequence
, a list, vector, or string, with
elements equal
to object
removed. For example:
(remove '(2) '((2) (1) (2)))
⇒ ((1))
(remove '(2) [(2) (1) (2)])
⇒ [(1)]
Common Lisp note: The functions member
, delete
and
remove
in GNU Emacs Lisp are derived from Maclisp, not Common
Lisp. The Common Lisp versions do not use equal
to compare
elements.
- Function: member-ignore-case object list ¶
This function is like member
, except that object should
be a string and that it ignores differences in letter-case and text
representation: upper-case and lower-case letters are treated as
equal, and unibyte strings are converted to multibyte prior to
comparison.
- Function: delete-dups list ¶
This function destructively removes all equal
duplicates from
list, stores the result in list and returns it. Of
several equal
occurrences of an element in list,
delete-dups
keeps the first one. See seq-uniq
for
non-destructive operation (see Sequences).
See also the function add-to-list
, in Modifying List Variables,
for a way to add an element to a list stored in a variable and used as a
set.
5.8 Association Lists
An association list, or alist for short, records a mapping
from keys to values. It is a list of cons cells called
associations: the CAR of each cons cell is the key, and the
CDR is the associated value.6
Here is an example of an alist. The key pine
is associated with
the value cones
; the key oak
is associated with
acorns
; and the key maple
is associated with seeds
.
((pine . cones)
(oak . acorns)
(maple . seeds))
Both the values and the keys in an alist may be any Lisp objects.
For example, in the following alist, the symbol a
is
associated with the number 1
, and the string "b"
is
associated with the list (2 3)
, which is the CDR of
the alist element:
Sometimes it is better to design an alist to store the associated
value in the CAR of the CDR of the element. Here is an
example of such an alist:
((rose red) (lily white) (buttercup yellow))
Here we regard red
as the value associated with rose
. One
advantage of this kind of alist is that you can store other related
information—even a list of other items—in the CDR of the
CDR. One disadvantage is that you cannot use rassq
(see
below) to find the element containing a given value. When neither of
these considerations is important, the choice is a matter of taste, as
long as you are consistent about it for any given alist.
The same alist shown above could be regarded as having the
associated value in the CDR of the element; the value associated
with rose
would be the list (red)
.
Association lists are often used to record information that you might
otherwise keep on a stack, since new associations may be added easily to
the front of the list. When searching an association list for an
association with a given key, the first one found is returned, if there
is more than one.
In Emacs Lisp, it is not an error if an element of an
association list is not a cons cell. The alist search functions simply
ignore such elements. Many other versions of Lisp signal errors in such
cases.
Note that property lists are similar to association lists in several
respects. A property list behaves like an association list in which
each key can occur only once. See Property Lists, for a comparison
of property lists and association lists.
- Function: assoc key alist &optional testfn ¶
This function returns the first association for key in
alist, comparing key against the alist elements using
testfn if it is a function, and equal
otherwise
(see Equality Predicates). If testfn is a function, it is
called with two arguments: the CAR of an element from alist
and key. The function returns nil
if no
association in alist has a CAR equal to key, as
tested by testfn. For example:
(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
⇒ ((pine . cones) (oak . acorns) (maple . seeds))
(assoc 'oak trees)
⇒ (oak . acorns)
(cdr (assoc 'oak trees))
⇒ acorns
(assoc 'birch trees)
⇒ nil
Here is another example, in which the keys and values are not symbols:
(setq needles-per-cluster
'((2 "Austrian Pine" "Red Pine")
(3 "Pitch Pine")
(5 "White Pine")))
(cdr (assoc 3 needles-per-cluster))
⇒ ("Pitch Pine")
(cdr (assoc 2 needles-per-cluster))
⇒ ("Austrian Pine" "Red Pine")
The function assoc-string
is much like assoc
except
that it ignores certain differences between strings. See Comparison of Characters and Strings.
- Function: rassoc value alist ¶
This function returns the first association with value value in
alist. It returns nil
if no association in alist has
a CDR equal
to value.
rassoc
is like assoc
except that it compares the CDR of
each alist association instead of the CAR. You can think of
this as reverse assoc
, finding the key for a given value.
- Function: assq key alist ¶
This function is like assoc
in that it returns the first
association for key in alist, but it makes the comparison
using eq
. assq
returns nil
if no association in
alist has a CAR eq
to key. This function is
used more often than assoc
, since eq
is faster than
equal
and most alists use symbols as keys. See Equality Predicates.
(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
⇒ ((pine . cones) (oak . acorns) (maple . seeds))
(assq 'pine trees)
⇒ (pine . cones)
On the other hand, assq
is not usually useful in alists where the
keys may not be symbols:
(setq leaves
'(("simple leaves" . oak)
("compound leaves" . horsechestnut)))
(assq "simple leaves" leaves)
⇒ Unspecified; might be nil
or ("simple leaves" . oak)
.
(assoc "simple leaves" leaves)
⇒ ("simple leaves" . oak)
- Function: alist-get key alist &optional default remove testfn ¶
This function is similar to assq
. It finds the first
association (key . value)
by comparing
key with alist elements, and, if found, returns the
value of that association. If no association is found, the
function returns default. Comparison of key against
alist elements uses the function specified by testfn,
defaulting to eq
.
This is a generalized variable (see Generalized Variables)
that can be used to change a value with setf
. When
using it to set a value, optional argument remove non-nil
means to remove key’s association from alist if the new
value is eql
to default.
- Function: rassq value alist ¶
This function returns the first association with value value in
alist. It returns nil
if no association in alist has
a CDR eq
to value.
rassq
is like assq
except that it compares the CDR of
each alist association instead of the CAR. You can think of
this as reverse assq
, finding the key for a given value.
For example:
(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
(rassq 'acorns trees)
⇒ (oak . acorns)
(rassq 'spores trees)
⇒ nil
rassq
cannot search for a value stored in the CAR
of the CDR of an element:
(setq colors '((rose red) (lily white) (buttercup yellow)))
(rassq 'white colors)
⇒ nil
In this case, the CDR of the association (lily white)
is not
the symbol white
, but rather the list (white)
. This
becomes clearer if the association is written in dotted pair notation:
(lily white) ≡ (lily . (white))
- Function: assoc-default key alist &optional test default ¶
This function searches alist for a match for key. For each
element of alist, it compares the element (if it is an atom) or
the element’s CAR (if it is a cons) against key, by calling
test with two arguments: the element or its CAR, and
key. The arguments are passed in that order so that you can get
useful results using string-match
with an alist that contains
regular expressions (see Regular Expression Searching). If test is omitted
or nil
, equal
is used for comparison.
If an alist element matches key by this criterion,
then assoc-default
returns a value based on this element.
If the element is a cons, then the value is the element’s CDR.
Otherwise, the return value is default.
If no alist element matches key, assoc-default
returns
nil
.
- Function: copy-alist alist ¶
-
This function returns a two-level deep copy of alist: it creates a
new copy of each association, so that you can alter the associations of
the new alist without changing the old one.
(setq needles-per-cluster
'((2 . ("Austrian Pine" "Red Pine"))
(3 . ("Pitch Pine"))
(5 . ("White Pine"))))
⇒
((2 "Austrian Pine" "Red Pine")
(3 "Pitch Pine")
(5 "White Pine"))
(setq copy (copy-alist needles-per-cluster))
⇒
((2 "Austrian Pine" "Red Pine")
(3 "Pitch Pine")
(5 "White Pine"))
(eq needles-per-cluster copy)
⇒ nil
(equal needles-per-cluster copy)
⇒ t
(eq (car needles-per-cluster) (car copy))
⇒ nil
(cdr (car (cdr needles-per-cluster)))
⇒ ("Pitch Pine")
(eq (cdr (car (cdr needles-per-cluster)))
(cdr (car (cdr copy))))
⇒ t
This example shows how copy-alist
makes it possible to change
the associations of one copy without affecting the other:
(setcdr (assq 3 copy) '("Martian Vacuum Pine"))
(cdr (assq 3 needles-per-cluster))
⇒ ("Pitch Pine")
- Function: assq-delete-all key alist ¶
This function deletes from alist all the elements whose CAR
is eq
to key, much as if you used delq
to delete
each such element one by one. It returns the shortened alist, and
often modifies the original list structure of alist. For
correct results, use the return value of assq-delete-all
rather
than looking at the saved value of alist.
(setq alist (list '(foo 1) '(bar 2) '(foo 3) '(lose 4)))
⇒ ((foo 1) (bar 2) (foo 3) (lose 4))
(assq-delete-all 'foo alist)
⇒ ((bar 2) (lose 4))
alist
⇒ ((foo 1) (bar 2) (lose 4))
- Function: assoc-delete-all key alist &optional test ¶
This function is like assq-delete-all
except that it accepts
an optional argument test, a predicate function to compare the
keys in alist. If omitted or nil
, test defaults to
equal
. As assq-delete-all
, this function often modifies
the original list structure of alist.
- Function: rassq-delete-all value alist ¶
This function deletes from alist all the elements whose CDR
is eq
to value. It returns the shortened alist, and
often modifies the original list structure of alist.
rassq-delete-all
is like assq-delete-all
except that it
compares the CDR of each alist association instead of the
CAR.
- Macro: let-alist alist body ¶
Creates a binding for each symbol used as keys the association list
alist, prefixed with dot. This can be useful when accessing
several items in the same association list, and it’s best understood
through a simple example:
(setq colors '((rose . red) (lily . white) (buttercup . yellow)))
(let-alist colors
(if (eq .rose 'red)
.lily))
⇒ white
The body is inspected at compilation time, and only the symbols
that appear in body with a ‘.’ as the first character in
the symbol name will be bound. Finding the keys is done with
assq
, and the cdr
of the return value of this
assq
is assigned as the value for the binding.
Nested association lists is supported:
(setq colors '((rose . red) (lily (belladonna . yellow) (brindisi . pink))))
(let-alist colors
(if (eq .rose 'red)
.lily.belladonna))
⇒ yellow
Nesting let-alist
inside each other is allowed, but the code in
the inner let-alist
can’t access the variables bound by the
outer let-alist
.
5.9 Property Lists
A property list (plist for short) is a list of paired
elements. Each of the pairs associates a property name (usually a
symbol) with a property or value. Here is an example of a property
list:
(pine cones numbers (1 2 3) color "blue")
This property list associates pine
with cones
,
numbers
with (1 2 3)
, and color
with
"blue"
. The property names and values can be any Lisp objects,
but the names are usually symbols (as they are in this example).
Property lists are used in several contexts. For instance, the
function put-text-property
takes an argument which is a
property list, specifying text properties and associated values which
are to be applied to text in a string or buffer. See Text Properties.
Another prominent use of property lists is for storing symbol
properties. Every symbol possesses a list of properties, used to
record miscellaneous information about the symbol; these properties
are stored in the form of a property list. See Symbol Properties.
- Function: plistp object ¶
This predicate function returns non-nil
if object is a
valid property list.
5.9.1 Property Lists and Association Lists
Association lists (see Association Lists) are very similar to
property lists. In contrast to association lists, the order of the
pairs in the property list is not significant, since the property
names must be distinct.
Property lists are better than association lists for attaching
information to various Lisp function names or variables. If your
program keeps all such information in one association list, it will
typically need to search that entire list each time it checks for an
association for a particular Lisp function name or variable, which
could be slow. By contrast, if you keep the same information in the
property lists of the function names or variables themselves, each
search will scan only the length of one property list, which is
usually short. This is why the documentation for a variable is
recorded in a property named variable-documentation
. The byte
compiler likewise uses properties to record those functions needing
special treatment.
However, association lists have their own advantages. Depending on
your application, it may be faster to add an association to the front of
an association list than to update a property. All properties for a
symbol are stored in the same property list, so there is a possibility
of a conflict between different uses of a property name. (For this
reason, it is a good idea to choose property names that are probably
unique, such as by beginning the property name with the program’s usual
name-prefix for variables and functions.) An association list may be
used like a stack where associations are pushed on the front of the list
and later discarded; this is not possible with a property list.
5.9.2 Property Lists Outside Symbols
The following functions can be used to manipulate property lists.
They all default to comparing property names using eq
.
- Function: plist-get plist property &optional predicate ¶
This returns the value of the property property stored in the
property list plist. Comparisons are done with predicate,
which defaults to eq
. It accepts a malformed plist
argument. If property is not found in the plist, it
returns nil
. For example,
(plist-get '(foo 4) 'foo)
⇒ 4
(plist-get '(foo 4 bad) 'foo)
⇒ 4
(plist-get '(foo 4 bad) 'bad)
⇒ nil
(plist-get '(foo 4 bad) 'bar)
⇒ nil
- Function: plist-put plist property value &optional predicate ¶
This stores value as the value of the property property in
the property list plist. Comparisons are done with predicate,
which defaults to eq
. It may modify plist destructively,
or it may construct a new list structure without altering the old. The
function returns the modified property list, so you can store that back
in the place where you got plist. For example,
(setq my-plist (list 'bar t 'foo 4))
⇒ (bar t foo 4)
(setq my-plist (plist-put my-plist 'foo 69))
⇒ (bar t foo 69)
(setq my-plist (plist-put my-plist 'quux '(a)))
⇒ (bar t foo 69 quux (a))
- Function: lax-plist-get plist property ¶
This obsolete function is like plist-get
except that it
compares properties using equal
instead of eq
.
- Function: lax-plist-put plist property value ¶
This obsolete function is like plist-put
except that it
compares properties using equal
instead of eq
.
- Function: plist-member plist property &optional predicate ¶
This returns non-nil
if plist contains the given
property. Comparisons are done with predicate, which
defaults to eq
. Unlike plist-get
, this allows you to
distinguish between a missing property and a property with the value
nil
. The value is actually the tail of plist whose
car
is property.
6 Sequences, Arrays, and Vectors
The sequence type is the union of two other Lisp types: lists
and arrays. In other words, any list is a sequence, and any array is
a sequence. The common property that all sequences have is that each
is an ordered collection of elements.
An array is a fixed-length object with a slot for each of its
elements. All the elements are accessible in constant time. The four
types of arrays are strings, vectors, char-tables and bool-vectors.
A list is a sequence of elements, but it is not a single primitive
object; it is made of cons cells, one cell per element. Finding the
nth element requires looking through n cons cells, so
elements farther from the beginning of the list take longer to access.
But it is possible to add elements to the list, or remove elements.
The following diagram shows the relationship between these types:
_____________________________________________
| |
| Sequence |
| ______ ________________________________ |
| | | | | |
| | List | | Array | |
| | | | ________ ________ | |
| |______| | | | | | | |
| | | Vector | | String | | |
| | |________| |________| | |
| | ____________ _____________ | |
| | | | | | | |
| | | Char-table | | Bool-vector | | |
| | |____________| |_____________| | |
| |________________________________| |
|_____________________________________________|
6.1 Sequences
This section describes functions that accept any kind of sequence.
- Function: sequencep object ¶
This function returns t
if object is a list, vector,
string, bool-vector, or char-table, nil
otherwise. See also
seqp
below.
- Function: length sequence ¶
-
This function returns the number of elements in sequence. The
function signals the wrong-type-argument
error if the argument
is not a sequence or is a dotted list; it signals the
circular-list
error if the argument is a circular list. For a
char-table, the value returned is always one more than the maximum
Emacs character code.
See Definition of safe-length, for the related function safe-length
.
(length '(1 2 3))
⇒ 3
(length ())
⇒ 0
(length "foobar")
⇒ 6
(length [1 2 3])
⇒ 3
(length (make-bool-vector 5 nil))
⇒ 5
See also string-bytes
, in Text Representations.
If you need to compute the width of a string on display, you should use
string-width
(see Size of Displayed Text), not length
,
since length
only counts the number of characters, but does not
account for the display width of each character.
- Function: length< sequence length ¶
Return non-nil
if sequence is shorter than length.
This may be more efficient than computing the length of sequence
if sequence is a long list.
- Function: length> sequence length ¶
Return non-nil
if sequence is longer than length.
- Function: length= sequence length ¶
Return non-nil
if the length of sequence is equal to
length.
- Function: elt sequence index ¶
-
This function returns the element of sequence indexed by
index. Legitimate values of index are integers ranging
from 0 up to one less than the length of sequence. If
sequence is a list, out-of-range values behave as for
nth
. See Definition of nth. Otherwise, out-of-range values
trigger an args-out-of-range
error.
(elt [1 2 3 4] 2)
⇒ 3
(elt '(1 2 3 4) 2)
⇒ 3
;; We use string
to show clearly which character elt
returns.
(string (elt "1234" 2))
⇒ "3"
(elt [1 2 3 4] 4)
error→ Args out of range: [1 2 3 4], 4
(elt [1 2 3 4] -1)
error→ Args out of range: [1 2 3 4], -1
This function generalizes aref
(see Functions that Operate on Arrays) and
nth
(see Definition of nth).
- Function: copy-sequence seqr ¶
-
This function returns a copy of seqr, which should be either a
sequence or a record. The copy is the same type of object as the
original, and it has the same elements in the same order. However, if
seqr is empty, like a string or a vector of zero length, the
value returned by this function might not be a copy, but an empty
object of the same type and identical to seqr.
Storing a new element into the copy does not affect the original
seqr, and vice versa. However, the elements of the copy
are not copies; they are identical (eq
) to the elements
of the original. Therefore, changes made within these elements, as
found via the copy, are also visible in the original.
If the argument is a string with text properties, the property list in
the copy is itself a copy, not shared with the original’s property
list. However, the actual values of the properties are shared.
See Text Properties.
This function does not work for dotted lists. Trying to copy a
circular list may cause an infinite loop.
See also append
in Building Cons Cells and Lists, concat
in
Creating Strings, and vconcat
in Functions for Vectors,
for other ways to copy sequences.
(setq bar (list 1 2))
⇒ (1 2)
(setq x (vector 'foo bar))
⇒ [foo (1 2)]
(setq y (copy-sequence x))
⇒ [foo (1 2)]
(eq x y)
⇒ nil
(equal x y)
⇒ t
(eq (elt x 1) (elt y 1))
⇒ t
;; Replacing an element of one sequence.
(aset x 0 'quux)
x ⇒ [quux (1 2)]
y ⇒ [foo (1 2)]
;; Modifying the inside of a shared element.
(setcar (aref x 1) 69)
x ⇒ [quux (69 2)]
y ⇒ [foo (69 2)]
- Function: reverse sequence ¶
-
This function creates a new sequence whose elements are the elements
of sequence, but in reverse order. The original argument sequence
is not altered. Note that char-tables cannot be reversed.
(setq x '(1 2 3 4))
⇒ (1 2 3 4)
(reverse x)
⇒ (4 3 2 1)
x
⇒ (1 2 3 4)
(setq x [1 2 3 4])
⇒ [1 2 3 4]
(reverse x)
⇒ [4 3 2 1]
x
⇒ [1 2 3 4]
(setq x "xyzzy")
⇒ "xyzzy"
(reverse x)
⇒ "yzzyx"
x
⇒ "xyzzy"
- Function: nreverse sequence ¶
-
This function reverses the order of the elements of sequence.
Unlike reverse
the original sequence may be modified.
For example:
(setq x (list 'a 'b 'c))
⇒ (a b c)
x
⇒ (a b c)
(nreverse x)
⇒ (c b a)
;; The cons cell that was first is now last.
x
⇒ (a)
To avoid confusion, we usually store the result of nreverse
back in the same variable which held the original list:
Here is the nreverse
of our favorite example, (a b c)
,
presented graphically:
Original list head: Reversed list:
------------- ------------- ------------
| car | cdr | | car | cdr | | car | cdr |
| a | nil |<-- | b | o |<-- | c | o |
| | | | | | | | | | | | |
------------- | --------- | - | -------- | -
| | | |
------------- ------------
For the vector, it is even simpler because you don’t need setq:
(setq x (copy-sequence [1 2 3 4]))
⇒ [1 2 3 4]
(nreverse x)
⇒ [4 3 2 1]
x
⇒ [4 3 2 1]
Note that unlike reverse
, this function doesn’t work with strings.
Although you can alter string data by using aset
, it is strongly
encouraged to treat strings as immutable even when they are mutable.
See Mutability.
- Function: sort sequence predicate ¶
-
This function sorts sequence stably. Note that this function doesn’t work
for all sequences; it may be used only for lists and vectors. If sequence
is a list, it is modified destructively. This functions returns the sorted
sequence and compares elements using predicate. A stable sort is
one in which elements with equal sort keys maintain their relative order before
and after the sort. Stability is important when successive sorts are used to
order elements according to different criteria.
The argument predicate must be a function that accepts two
arguments. It is called with two elements of sequence. To get an
increasing order sort, the predicate should return non-nil
if the
first element is “less” than the second, or nil
if not.
The comparison function predicate must give reliable results for
any given pair of arguments, at least within a single call to
sort
. It must be antisymmetric; that is, if a is
less than b, b must not be less than a. It must be
transitive—that is, if a is less than b, and b
is less than c, then a must be less than c. If you
use a comparison function which does not meet these requirements, the
result of sort
is unpredictable.
The destructive aspect of sort
for lists is that it reuses the
cons cells forming sequence by changing their contents, possibly
rearranging them in a different order. This means that the value of
the input list is undefined after sorting; only the list returned by
sort
has a well-defined value. Example:
(setq nums (list 2 1 4 3 0))
(sort nums #'<)
⇒ (0 1 2 3 4)
; nums is unpredictable at this point
Most often we store the result back into the variable that held the
original list:
(setq nums (sort nums #'<))
If you wish to make a sorted copy without destroying the original,
copy it first and then sort:
(setq nums (list 2 1 4 3 0))
(sort (copy-sequence nums) #'<)
⇒ (0 1 2 3 4)
nums
⇒ (2 1 4 3 0)
For the better understanding of what stable sort is, consider the following
vector example. After sorting, all items whose car
is 8 are grouped
at the beginning of vector
, but their relative order is preserved.
All items whose car
is 9 are grouped at the end of vector
,
but their relative order is also preserved:
(setq
vector
(vector '(8 . "xxx") '(9 . "aaa") '(8 . "bbb") '(9 . "zzz")
'(9 . "ppp") '(8 . "ttt") '(8 . "eee") '(9 . "fff")))
⇒ [(8 . "xxx") (9 . "aaa") (8 . "bbb") (9 . "zzz")
(9 . "ppp") (8 . "ttt") (8 . "eee") (9 . "fff")]
(sort vector (lambda (x y) (< (car x) (car y))))
⇒ [(8 . "xxx") (8 . "bbb") (8 . "ttt") (8 . "eee")
(9 . "aaa") (9 . "zzz") (9 . "ppp") (9 . "fff")]
See Sorting Text, for more functions that perform sorting.
See documentation
in Access to Documentation Strings, for a
useful example of sort
.
The seq.el library provides the following additional sequence
manipulation macros and functions, prefixed with seq-
.
All functions defined in this library are free of side-effects;
i.e., they do not modify any sequence (list, vector, or string) that
you pass as an argument. Unless otherwise stated, the result is a
sequence of the same type as the input. For those functions that take
a predicate, this should be a function of one argument.
The seq.el library can be extended to work with additional
types of sequential data-structures. For that purpose, all functions
are defined using cl-defgeneric
. See Generic Functions, for
more details about using cl-defgeneric
for adding extensions.
- Function: seq-elt sequence index ¶
This function returns the element of sequence at the specified
index, which is an integer whose valid value range is zero to
one less than the length of sequence. For out-of-range values
on built-in sequence types, seq-elt
behaves like elt
.
For the details, see Definition of elt.
(seq-elt [1 2 3 4] 2)
⇒ 3
seq-elt
returns places settable using setf
(see The setf
Macro).
(setq vec [1 2 3 4])
(setf (seq-elt vec 2) 5)
vec
⇒ [1 2 5 4]
- Function: seq-length sequence ¶
This function returns the number of elements in sequence. For
built-in sequence types, seq-length
behaves like length
.
See Definition of length.
- Function: seqp object ¶
This function returns non-nil
if object is a sequence
(a list or array), or any additional type of sequence defined via
seq.el generic functions. This is an extensible variant of
sequencep
.
(seqp [1 2])
⇒ t
(seqp 2)
⇒ nil
- Function: seq-drop sequence n ¶
This function returns all but the first n (an integer)
elements of sequence. If n is negative or zero,
the result is sequence.
(seq-drop [1 2 3 4 5 6] 3)
⇒ [4 5 6]
(seq-drop "hello world" -4)
⇒ "hello world"
- Function: seq-take sequence n ¶
This function returns the first n (an integer) elements of
sequence. If n is negative or zero, the result
is nil
.
(seq-take '(1 2 3 4) 3)
⇒ (1 2 3)
(seq-take [1 2 3 4] 0)
⇒ []
- Function: seq-take-while predicate sequence ¶
This function returns the members of sequence in order,
stopping before the first one for which predicate returns nil
.
(seq-take-while (lambda (elt) (> elt 0)) '(1 2 3 -1 -2))
⇒ (1 2 3)
(seq-take-while (lambda (elt) (> elt 0)) [-1 4 6])
⇒ []
- Function: seq-drop-while predicate sequence ¶
This function returns the members of sequence in order,
starting from the first one for which predicate returns nil
.
(seq-drop-while (lambda (elt) (> elt 0)) '(1 2 3 -1 -2))
⇒ (-1 -2)
(seq-drop-while (lambda (elt) (< elt 0)) [1 4 6])
⇒ [1 4 6]
- Function: seq-split sequence length ¶
This function returns a list consisting of sub-sequences of
sequence of (at most) length length. (The final element
may be shorter than length if the length of sequence isn’t
a multiple of length.
(seq-split [0 1 2 3 4] 2)
⇒ ([0 1] [2 3] [4])
- Function: seq-do function sequence ¶
This function applies function to each element of
sequence in turn (presumably for side effects), and returns
sequence.
- Function: seq-map function sequence ¶
This function returns the result of applying function to each
element of sequence. The returned value is a list.
(seq-map #'1+ '(2 4 6))
⇒ (3 5 7)
(seq-map #'symbol-name [foo bar])
⇒ ("foo" "bar")
- Function: seq-map-indexed function sequence ¶
This function returns the result of applying function to each
element of sequence and its index within seq. The
returned value is a list.
(seq-map-indexed (lambda (elt idx)
(list idx elt))
'(a b c))
⇒ ((0 a) (1 b) (2 c))
- Function: seq-mapn function &rest sequences ¶
This function returns the result of applying function to each
element of sequences. The arity (see subr-arity) of function must match the number of sequences.
Mapping stops at the end of the shortest sequence, and the returned
value is a list.
(seq-mapn #'+ '(2 4 6) '(20 40 60))
⇒ (22 44 66)
(seq-mapn #'concat '("moskito" "bite") ["bee" "sting"])
⇒ ("moskitobee" "bitesting")
- Function: seq-filter predicate sequence ¶
-
This function returns a list of all the elements in sequence
for which predicate returns non-nil
.
(seq-filter (lambda (elt) (> elt 0)) [1 -1 3 -3 5])
⇒ (1 3 5)
(seq-filter (lambda (elt) (> elt 0)) '(-1 -3 -5))
⇒ nil
- Function: seq-remove predicate sequence ¶
-
This function returns a list of all the elements in sequence
for which predicate returns nil
.
(seq-remove (lambda (elt) (> elt 0)) [1 -1 3 -3 5])
⇒ (-1 -3)
(seq-remove (lambda (elt) (< elt 0)) '(-1 -3 -5))
⇒ nil
- Function: seq-remove-at-position sequence n ¶
-
This function returns a copy of sequence where the element at
(zero-based) index n got removed. The result is a sequence of
the same type as sequence.
(seq-remove-at-position [1 -1 3 -3 5] 0)
⇒ [-1 3 -3 5]
(seq-remove-at-position [1 -1 3 -3 5] 3)
⇒ [1 -1 3 5]
- Function: seq-keep function sequence ¶
This function returns a list of all non-nil
results from
calling function on the elements in sequence.
(seq-keep #'cl-digit-char-p '(?6 ?a ?7))
⇒ (6 7)
- Function: seq-reduce function sequence initial-value ¶
-
This function returns the result of calling function with
initial-value and the first element of sequence, then calling
function with that result and the second element of sequence,
then with that result and the third element of sequence, etc.
function should be a function of two arguments.
function is called with two arguments. initial-value
(and then the accumulated value) is used as the first argument, and
the elements in sequence are used for the second argument.
If sequence is empty, this returns initial-value without
calling function.
(seq-reduce #'+ [1 2 3 4] 0)
⇒ 10
(seq-reduce #'+ '(1 2 3 4) 5)
⇒ 15
(seq-reduce #'+ '() 3)
⇒ 3
- Function: seq-some predicate sequence ¶
This function returns the first non-nil
value returned by
applying predicate to each element of sequence in turn.
(seq-some #'numberp ["abc" 1 nil])
⇒ t
(seq-some #'numberp ["abc" "def"])
⇒ nil
(seq-some #'null ["abc" 1 nil])
⇒ t
(seq-some #'1+ [2 4 6])
⇒ 3
- Function: seq-find predicate sequence &optional default ¶
This function returns the first element in sequence for which
predicate returns non-nil
. If no element matches
predicate, the function returns default.
Note that this function has an ambiguity if the found element is
identical to default, as in that case it cannot be known whether
an element was found or not.
(seq-find #'numberp ["abc" 1 nil])
⇒ 1
(seq-find #'numberp ["abc" "def"])
⇒ nil
- Function: seq-every-p predicate sequence ¶
This function returns non-nil
if applying predicate
to every element of sequence returns non-nil
.
(seq-every-p #'numberp [2 4 6])
⇒ t
(seq-every-p #'numberp [2 4 "6"])
⇒ nil
- Function: seq-empty-p sequence ¶
This function returns non-nil
if sequence is empty.
(seq-empty-p "not empty")
⇒ nil
(seq-empty-p "")
⇒ t
- Function: seq-count predicate sequence ¶
This function returns the number of elements in sequence for which
predicate returns non-nil
.
(seq-count (lambda (elt) (> elt 0)) [-1 2 0 3 -2])
⇒ 2
- Function: seq-sort function sequence ¶
This function returns a copy of sequence that is sorted
according to function, a function of two arguments that returns
non-nil
if the first argument should sort before the second.
- Function: seq-sort-by function predicate sequence ¶
This function is similar to seq-sort
, but the elements of
sequence are transformed by applying function on them
before being sorted. function is a function of one argument.
(seq-sort-by #'seq-length #'> ["a" "ab" "abc"])
⇒ ["abc" "ab" "a"]
- Function: seq-contains-p sequence elt &optional function ¶
This function returns non-nil
if at least one element in
sequence is equal to elt. If the optional argument
function is non-nil
, it is a function of two arguments to
use instead of the default equal
.
(seq-contains-p '(symbol1 symbol2) 'symbol1)
⇒ t
(seq-contains-p '(symbol1 symbol2) 'symbol3)
⇒ nil
- Function: seq-set-equal-p sequence1 sequence2 &optional testfn ¶
This function checks whether sequence1 and sequence2
contain the same elements, regardless of the order. If the optional
argument testfn is non-nil
, it is a function of two
arguments to use instead of the default equal
.
(seq-set-equal-p '(a b c) '(c b a))
⇒ t
(seq-set-equal-p '(a b c) '(c b))
⇒ nil
(seq-set-equal-p '("a" "b" "c") '("c" "b" "a"))
⇒ t
(seq-set-equal-p '("a" "b" "c") '("c" "b" "a") #'eq)
⇒ nil
- Function: seq-position sequence elt &optional function ¶
This function returns the (zero-based) index of the first element in
sequence that is equal to elt. If the optional argument
function is non-nil
, it is a function of two arguments to
use instead of the default equal
.
(seq-position '(a b c) 'b)
⇒ 1
(seq-position '(a b c) 'd)
⇒ nil
- Function: seq-positions sequence elt &optional testfn ¶
This function returns a list of the (zero-based) indices of the
elements in sequence for which testfn returns
non-nil
when passed the element and elt as
arguments. testfn defaults to equal
.
(seq-positions '(a b c a d) 'a)
⇒ (0 3)
(seq-positions '(a b c a d) 'z)
⇒ nil
(seq-positions '(11 5 7 12 9 15) 10 #'>=)
⇒ (0 3 5)
- Function: seq-uniq sequence &optional function ¶
This function returns a list of the elements of sequence with
duplicates removed. If the optional argument function is non-nil
,
it is a function of two arguments to use instead of the default equal
.
(seq-uniq '(1 2 2 1 3))
⇒ (1 2 3)
(seq-uniq '(1 2 2.0 1.0) #'=)
⇒ (1 2)
- Function: seq-subseq sequence start &optional end ¶
-
This function returns a subset of sequence from start
to end, both integers (end defaults to the last element).
If start or end is negative, it counts from the end of
sequence.
(seq-subseq '(1 2 3 4 5) 1)
⇒ (2 3 4 5)
(seq-subseq '[1 2 3 4 5] 1 3)
⇒ [2 3]
(seq-subseq '[1 2 3 4 5] -3 -1)
⇒ [3 4]
- Function: seq-concatenate type &rest sequences ¶
This function returns a sequence of type type made of the
concatenation of sequences. type may be: vector
,
list
or string
.
(seq-concatenate 'list '(1 2) '(3 4) [5 6])
⇒ (1 2 3 4 5 6)
(seq-concatenate 'string "Hello " "world")
⇒ "Hello world"
- Function: seq-mapcat function sequence &optional type ¶
This function returns the result of applying seq-concatenate
to the result of applying function to each element of
sequence. The result is a sequence of type type, or a
list if type is nil
.
(seq-mapcat #'seq-reverse '((3 2 1) (6 5 4)))
⇒ (1 2 3 4 5 6)
- Function: seq-partition sequence n ¶
This function returns a list of the elements of sequence
grouped into sub-sequences of length n. The last sequence may
contain less elements than n. n must be an integer. If
n is a negative integer or 0, the return value is nil
.
(seq-partition '(0 1 2 3 4 5 6 7) 3)
⇒ ((0 1 2) (3 4 5) (6 7))
- Function: seq-union sequence1 sequence2 &optional function ¶
-
This function returns a list of the elements that appear either in
sequence1 or sequence2. The elements of the returned list
are all unique, in the sense that no two elements there will compare
equal. If the optional argument function is non-nil
, it
should be a function of two arguments to use to compare elements,
instead of the default equal
.
(seq-union [1 2 3] [3 5])
⇒ (1 2 3 5)
- Function: seq-intersection sequence1 sequence2 &optional function ¶
-
This function returns a list of the elements that appear both in
sequence1 and sequence2. If the optional argument
function is non-nil
, it is a function of two arguments to
use to compare elements instead of the default equal
.
(seq-intersection [2 3 4 5] [1 3 5 6 7])
⇒ (3 5)
- Function: seq-difference sequence1 sequence2 &optional function ¶
This function returns a list of the elements that appear in
sequence1 but not in sequence2. If the optional argument
function is non-nil
, it is a function of two arguments to
use to compare elements instead of the default equal
.
(seq-difference '(2 3 4 5) [1 3 5 6 7])
⇒ (2 4)
- Function: seq-group-by function sequence ¶
This function separates the elements of sequence into an alist
whose keys are the result of applying function to each element
of sequence. Keys are compared using equal
.
(seq-group-by #'integerp '(1 2.1 3 2 3.2))
⇒ ((t 1 3 2) (nil 2.1 3.2))
(seq-group-by #'car '((a 1) (b 2) (a 3) (c 4)))
⇒ ((b (b 2)) (a (a 1) (a 3)) (c (c 4)))
- Function: seq-into sequence type ¶
-
This function converts the sequence sequence into a sequence
of type type. type can be one of the following symbols:
vector
, string
or list
.
(seq-into [1 2 3] 'list)
⇒ (1 2 3)
(seq-into nil 'vector)
⇒ []
(seq-into "hello" 'vector)
⇒ [104 101 108 108 111]
- Function: seq-min sequence ¶
-
This function returns the smallest element of sequence. The
elements of sequence must be numbers or markers
(see Markers).
(seq-min [3 1 2])
⇒ 1
(seq-min "Hello")
⇒ 72
- Function: seq-max sequence ¶
-
This function returns the largest element of sequence. The
elements of sequence must be numbers or markers.
(seq-max [1 3 2])
⇒ 3
(seq-max "Hello")
⇒ 111
- Macro: seq-doseq (var sequence) body… ¶
-
This macro is like dolist
(see dolist), except
that sequence can be a list, vector or string. This is
primarily useful for side-effects.
- Macro: seq-let var-sequence val-sequence body… ¶
-
This macro binds the variables defined in var-sequence to the
values that are the corresponding elements of val-sequence.
This is known as destructuring binding. The elements of
var-sequence can themselves include sequences, allowing for
nested destructuring.
The var-sequence sequence can also include the &rest
marker followed by a variable name to be bound to the rest of
val-sequence.
(seq-let [first second] [1 2 3 4]
(list first second))
⇒ (1 2)
(seq-let (_ a _ b) '(1 2 3 4)
(list a b))
⇒ (2 4)
(seq-let [a [b [c]]] [1 [2 [3]]]
(list a b c))
⇒ (1 2 3)
(seq-let [a b &rest others] [1 2 3 4]
others)
⇒ [3 4]
The pcase
patterns provide an alternative facility for
destructuring binding, see Destructuring with pcase
Patterns.
- Macro: seq-setq var-sequence val-sequence ¶
-
This macro works similarly to seq-let
, except that values are
assigned to variables as if by setq
instead of as in a
let
binding.
(let ((a nil)
(b nil))
(seq-setq (_ a _ b) '(1 2 3 4))
(list a b))
⇒ (2 4)
- Function: seq-random-elt sequence ¶
This function returns an element of sequence taken at random.
(seq-random-elt [1 2 3 4])
⇒ 3
(seq-random-elt [1 2 3 4])
⇒ 2
(seq-random-elt [1 2 3 4])
⇒ 4
(seq-random-elt [1 2 3 4])
⇒ 2
(seq-random-elt [1 2 3 4])
⇒ 1
If sequence is empty, this function signals an error.
6.2 Arrays
An array object has slots that hold a number of other Lisp
objects, called the elements of the array. Any element of an array
may be accessed in constant time. In contrast, the time to access an
element of a list is proportional to the position of that element in
the list.
Emacs defines four types of array, all one-dimensional:
strings (see String Type), vectors (see Vector Type), bool-vectors (see Bool-Vector Type), and
char-tables (see Char-Table Type). Vectors and char-tables
can hold elements of any type, but strings can only hold characters,
and bool-vectors can only hold t
and nil
.
All four kinds of array share these characteristics:
- The first element of an array has index zero, the second element has
index 1, and so on. This is called zero-origin indexing. For
example, an array of four elements has indices 0, 1, 2, and 3.
- The length of the array is fixed once you create it; you cannot
change the length of an existing array.
- For purposes of evaluation, the array is a constant—i.e.,
it evaluates to itself.
- The elements of an array may be referenced or changed with the functions
aref
and aset
, respectively (see Functions that Operate on Arrays).
When you create an array, other than a char-table, you must specify
its length. You cannot specify the length of a char-table, because that
is determined by the range of character codes.
In principle, if you want an array of text characters, you could use
either a string or a vector. In practice, we always choose strings for
such applications, for four reasons:
- They occupy one-fourth the space of a vector of the same elements.
- Strings are printed in a way that shows the contents more clearly
as text.
- Strings can hold text properties. See Text Properties.
- Many of the specialized editing and I/O facilities of Emacs accept only
strings. For example, you cannot insert a vector of characters into a
buffer the way you can insert a string. See Strings and Characters.
By contrast, for an array of keyboard input characters (such as a key
sequence), a vector may be necessary, because many keyboard input
characters are outside the range that will fit in a string. See Key Sequence Input.
6.3 Functions that Operate on Arrays
In this section, we describe the functions that accept all types of
arrays.
- Function: arrayp object ¶
This function returns t
if object is an array (i.e., a
vector, a string, a bool-vector or a char-table).
(arrayp [a])
⇒ t
(arrayp "asdf")
⇒ t
(arrayp (syntax-table)) ;; A char-table.
⇒ t
- Function: aref arr index ¶
-
This function returns the indexth element of the array or record
arr. The first element is at index zero.
(setq primes [2 3 5 7 11 13])
⇒ [2 3 5 7 11 13]
(aref primes 4)
⇒ 11
(aref "abcdefg" 1)
⇒ 98 ; ‘b’ is ASCII code 98.
See also the function elt
, in Sequences.
- Function: aset array index object ¶
This function sets the indexth element of array to be
object. It returns object.
(setq w (vector 'foo 'bar 'baz))
⇒ [foo bar baz]
(aset w 0 'fu)
⇒ fu
w
⇒ [fu bar baz]
;; copy-sequence
copies the string to be modified later.
(setq x (copy-sequence "asdfasfd"))
⇒ "asdfasfd"
(aset x 3 ?Z)
⇒ 90
x
⇒ "asdZasfd"
The array should be mutable. See Mutability.
If array is a string and object is not a character, a
wrong-type-argument
error results. The function converts a
unibyte string to multibyte if necessary to insert a character.
- Function: fillarray array object ¶
This function fills the array array with object, so that
each element of array is object. It returns array.
(setq a (copy-sequence [a b c d e f g]))
⇒ [a b c d e f g]
(fillarray a 0)
⇒ [0 0 0 0 0 0 0]
a
⇒ [0 0 0 0 0 0 0]
(setq s (copy-sequence "When in the course"))
⇒ "When in the course"
(fillarray s ?-)
⇒ "------------------"
If array is a string and object is not a character, a
wrong-type-argument
error results.
The general sequence functions copy-sequence
and length
are often useful for objects known to be arrays. See Sequences.
6.4 Vectors
A vector is a general-purpose array whose elements can be any
Lisp objects. (By contrast, the elements of a string can only be
characters. See Strings and Characters.) Vectors are used in
Emacs for many purposes: as key sequences (see Key Sequences), as
symbol-lookup tables (see Creating and Interning Symbols), as part of the
representation of a byte-compiled function (see Byte Compilation),
and more.
Like other arrays, vectors use zero-origin indexing: the first
element has index 0.
Vectors are printed with square brackets surrounding the elements.
Thus, a vector whose elements are the symbols a
, b
and
a
is printed as [a b a]
. You can write vectors in the
same way in Lisp input.
A vector, like a string or a number, is considered a constant for
evaluation: the result of evaluating it is the same vector. This does
not evaluate or even examine the elements of the vector.
See Self-Evaluating Forms. Vectors written with square brackets
should not be modified via aset
or other destructive
operations. See Mutability.
Here are examples illustrating these principles:
(setq avector [1 two '(three) "four" [five]])
⇒ [1 two '(three) "four" [five]]
(eval avector)
⇒ [1 two '(three) "four" [five]]
(eq avector (eval avector))
⇒ t
6.5 Functions for Vectors
Here are some functions that relate to vectors:
- Function: vectorp object ¶
This function returns t
if object is a vector.
(vectorp [a])
⇒ t
(vectorp "asdf")
⇒ nil
- Function: vector &rest objects ¶
This function creates and returns a vector whose elements are the
arguments, objects.
(vector 'foo 23 [bar baz] "rats")
⇒ [foo 23 [bar baz] "rats"]
(vector)
⇒ []
- Function: make-vector length object ¶
This function returns a new vector consisting of length elements,
each initialized to object.
(setq sleepy (make-vector 9 'Z))
⇒ [Z Z Z Z Z Z Z Z Z]
- Function: vconcat &rest sequences ¶
-
This function returns a new vector containing all the elements of
sequences. The arguments sequences may be proper lists,
vectors, strings or bool-vectors. If no sequences are given,
the empty vector is returned.
The value is either the empty vector, or is a newly constructed
nonempty vector that is not eq
to any existing vector.
(setq a (vconcat '(A B C) '(D E F)))
⇒ [A B C D E F]
(eq a (vconcat a))
⇒ nil
(vconcat)
⇒ []
(vconcat [A B C] "aa" '(foo (6 7)))
⇒ [A B C 97 97 foo (6 7)]
The vconcat
function also allows byte-code function objects as
arguments. This is a special feature to make it easy to access the entire
contents of a byte-code function object. See Byte-Code Function Objects.
For other concatenation functions, see mapconcat
in Mapping Functions, concat
in Creating Strings, and append
in Building Cons Cells and Lists.
The append
function also provides a way to convert a vector into a
list with the same elements:
(setq avector [1 two (quote (three)) "four" [five]])
⇒ [1 two '(three) "four" [five]]
(append avector nil)
⇒ (1 two '(three) "four" [five])
6.6 Char-Tables
A char-table is much like a vector, except that it is indexed by
character codes. Any valid character code, without modifiers, can be
used as an index in a char-table. You can access a char-table’s
elements with aref
and aset
, as with any array. In
addition, a char-table can have extra slots to hold additional
data not associated with particular character codes. Like vectors,
char-tables are constants when evaluated, and can hold elements of any
type.
Each char-table has a subtype, a symbol, which serves two
purposes:
- The subtype provides an easy way to tell what the char-table is for.
For instance, display tables are char-tables with
display-table
as the subtype, and syntax tables are char-tables with
syntax-table
as the subtype. The subtype can be queried using
the function char-table-subtype
, described below.
- The subtype controls the number of extra slots in the
char-table. This number is specified by the subtype’s
char-table-extra-slots
symbol property (see Symbol Properties), whose value should be an integer between 0 and 10. If
the subtype has no such symbol property, the char-table has no extra
slots.
A char-table can have a parent, which is another char-table. If
it does, then whenever the char-table specifies nil
for a
particular character c, it inherits the value specified in the
parent. In other words, (aref char-table c)
returns
the value from the parent of char-table if char-table itself
specifies nil
.
A char-table can also have a default value. If so, then
(aref char-table c)
returns the default value
whenever the char-table does not specify any other non-nil
value.
- Function: make-char-table subtype &optional init ¶
Return a newly-created char-table, with subtype subtype (a
symbol). Each element is initialized to init, which defaults to
nil
. You cannot alter the subtype of a char-table after the
char-table is created.
There is no argument to specify the length of the char-table, because
all char-tables have room for any valid character code as an index.
If subtype has the char-table-extra-slots
symbol
property, that specifies the number of extra slots in the char-table.
This should be an integer between 0 and 10; otherwise,
make-char-table
raises an error. If subtype has no
char-table-extra-slots
symbol property (see Property Lists), the char-table has no extra slots.
- Function: char-table-p object ¶
This function returns t
if object is a char-table, and
nil
otherwise.
- Function: char-table-subtype char-table ¶
This function returns the subtype symbol of char-table.
There is no special function to access default values in a char-table.
To do that, use char-table-range
(see below).
- Function: char-table-parent char-table ¶
This function returns the parent of char-table. The parent is
always either nil
or another char-table.
- Function: set-char-table-parent char-table new-parent ¶
This function sets the parent of char-table to new-parent.
This function returns the contents of extra slot n (zero based)
of char-table. The number of extra slots in a char-table is
determined by its subtype.
This function stores value in extra slot n (zero based) of
char-table.
A char-table can specify an element value for a single character code;
it can also specify a value for an entire character set.
- Function: char-table-range char-table range ¶
This returns the value specified in char-table for a range of
characters range. Here are the possibilities for range:
nil
Refers to the default value.
- char
Refers to the element for character char
(supposing char is a valid character code).
(from . to)
A cons cell refers to all the characters in the inclusive range
‘[from..to]’. In this case, the function returns the
value for the character specified by from.
- Function: set-char-table-range char-table range value ¶
This function sets the value in char-table for a range of
characters range. Here are the possibilities for range:
nil
Refers to the default value.
t
Refers to the whole range of character codes.
- char
Refers to the element for character char
(supposing char is a valid character code).
(from . to)
A cons cell refers to all the characters in the inclusive range
‘[from..to]’.
- Function: map-char-table function char-table ¶
This function calls its argument function for each element of
char-table that has a non-nil
value. The call to
function is with two arguments, a key and a value. The key
is a possible range argument for char-table-range
—either
a valid character or a cons cell (from . to)
,
specifying a range of characters that share the same value. The value is
what (char-table-range char-table key)
returns.
Overall, the key-value pairs passed to function describe all the
values stored in char-table.
The return value is always nil
; to make calls to
map-char-table
useful, function should have side effects.
For example, here is how to examine the elements of the syntax table:
(let (accumulator)
(map-char-table
(lambda (key value)
(setq accumulator
(cons (list
(if (consp key)
(list (car key) (cdr key))
key)
value)
accumulator)))
(syntax-table))
accumulator)
⇒
(((2597602 4194303) (2)) ((2597523 2597601) (3))
... (65379 (5 . 65378)) (65378 (4 . 65379)) (65377 (1))
... (12 (0)) (11 (3)) (10 (12)) (9 (0)) ((0 8) (3)))
6.7 Bool-vectors
A bool-vector is much like a vector, except that it stores only the
values t
and nil
. If you try to store any non-nil
value into an element of the bool-vector, the effect is to store
t
there. As with all arrays, bool-vector indices start from 0,
and the length cannot be changed once the bool-vector is created.
Bool-vectors are constants when evaluated.
Several functions work specifically with bool-vectors; aside
from that, you manipulate them with same functions used for other kinds
of arrays.
- Function: make-bool-vector length initial ¶
Return a new bool-vector of length elements,
each one initialized to initial.
- Function: bool-vector &rest objects ¶
This function creates and returns a bool-vector whose elements are the
arguments, objects.
- Function: bool-vector-p object ¶
This returns t
if object is a bool-vector,
and nil
otherwise.
There are also some bool-vector set operation functions, described below:
- Function: bool-vector-exclusive-or a b &optional c ¶
Return bitwise exclusive or of bool vectors a and b.
If optional argument c is given, the result of this operation is
stored into c. All arguments should be bool vectors of the same length.
- Function: bool-vector-union a b &optional c ¶
Return bitwise or of bool vectors a and b. If
optional argument c is given, the result of this operation is
stored into c. All arguments should be bool vectors of the same length.
- Function: bool-vector-intersection a b &optional c ¶
Return bitwise and of bool vectors a and b. If
optional argument c is given, the result of this operation is
stored into c. All arguments should be bool vectors of the same length.
- Function: bool-vector-set-difference a b &optional c ¶
Return set difference of bool vectors a and b. If
optional argument c is given, the result of this operation is
stored into c. All arguments should be bool vectors of the same length.
- Function: bool-vector-not a &optional b ¶
Return set complement of bool vector a. If optional
argument b is given, the result of this operation is stored into
b. All arguments should be bool vectors of the same length.
- Function: bool-vector-subsetp a b ¶
Return t
if every t
value in a is also t
in
b, nil
otherwise. All arguments should be bool vectors of the
same length.
- Function: bool-vector-count-consecutive a b i ¶
Return the number of consecutive elements in a equal b
starting at i. a
is a bool vector, b is t
or nil
, and i is an index into a
.
- Function: bool-vector-count-population a ¶
Return the number of elements that are t
in bool vector a.
The printed form represents up to 8 boolean values as a single
character:
(bool-vector t nil t nil)
⇒ #&4"^E"
(bool-vector)
⇒ #&0""
You can use vconcat
to print a bool-vector like other vectors:
(vconcat (bool-vector nil t nil t))
⇒ [nil t nil t]
Here is another example of creating, examining, and updating a
bool-vector:
(setq bv (make-bool-vector 5 t))
⇒ #&5"^_"
(aref bv 1)
⇒ t
(aset bv 3 nil)
⇒ nil
bv
⇒ #&5"^W"
These results make sense because the binary codes for control-_ and
control-W are 11111 and 10111, respectively.
6.8 Managing a Fixed-Size Ring of Objects
A ring is a fixed-size data structure that supports insertion,
deletion, rotation, and modulo-indexed reference and traversal. An
efficient ring data structure is implemented by the ring
package. It provides the functions listed in this section.
Note that several rings in Emacs, like the kill ring and the
mark ring, are actually implemented as simple lists, not using
the ring
package; thus the following functions won’t work on
them.
- Function: make-ring size ¶
This returns a new ring capable of holding size objects.
size should be an integer.
- Function: ring-p object ¶
This returns t
if object is a ring, nil
otherwise.
- Function: ring-size ring ¶
This returns the maximum capacity of the ring.
- Function: ring-length ring ¶
This returns the number of objects that ring currently contains.
The value will never exceed that returned by ring-size
.
- Function: ring-elements ring ¶
This returns a list of the objects in ring, in order, newest first.
- Function: ring-copy ring ¶
This returns a new ring which is a copy of ring.
The new ring contains the same (eq
) objects as ring.
- Function: ring-empty-p ring ¶
This returns t
if ring is empty, nil
otherwise.
The newest element in the ring always has index 0. Higher indices
correspond to older elements. Indices are computed modulo the ring
length. Index -1 corresponds to the oldest element, -2
to the next-oldest, and so forth.
- Function: ring-ref ring index ¶
This returns the object in ring found at index index.
index may be negative or greater than the ring length. If
ring is empty, ring-ref
signals an error.
- Function: ring-insert ring object ¶
This inserts object into ring, making it the newest
element, and returns object.
If the ring is full, insertion removes the oldest element to
make room for the new element.
- Function: ring-remove ring &optional index ¶
Remove an object from ring, and return that object. The
argument index specifies which item to remove; if it is
nil
, that means to remove the oldest item. If ring is
empty, ring-remove
signals an error.
- Function: ring-insert-at-beginning ring object ¶
This inserts object into ring, treating it as the oldest
element. The return value is not significant.
If the ring is full, this function removes the newest element to make
room for the inserted element.
- Function: ring-resize ring size ¶
Set the size of ring to size. If the new size is smaller,
then the oldest items in the ring are discarded.
If you are careful not to exceed the ring size, you can
use the ring as a first-in-first-out queue. For example:
(let ((fifo (make-ring 5)))
(mapc (lambda (obj) (ring-insert fifo obj))
'(0 one "two"))
(list (ring-remove fifo) t
(ring-remove fifo) t
(ring-remove fifo)))
⇒ (0 t one t "two")
7 Records
The purpose of records is to allow programmers to create objects
with new types that are not built into Emacs. They are used as the
underlying representation of cl-defstruct
and defclass
instances.
Internally, a record object is much like a vector; its slots can be
accessed using aref
and it can be copied using
copy-sequence
. However, the first slot is used to hold its
type as returned by type-of
. Also, in the current
implementation records can have at most 4096 slots, whereas vectors
can be much larger. Like arrays, records use zero-origin indexing:
the first slot has index 0.
The type slot should be a symbol or a type descriptor. If it’s a
type descriptor, the symbol naming its type will be returned;
Type Descriptors. Any other kind of object is returned as-is.
The printed representation of records is ‘#s’ followed by a
list specifying the contents. The first list element must be the
record type. The following elements are the record slots.
To avoid conflicts with other type names, Lisp programs that define
new types of records should normally use the naming conventions of the
package where these record types are introduced for the names of the
types. Note that the names of the types which could possibly conflict
might not be known at the time the package defining a record type is
loaded; they could be loaded at some future point in time.
A record is considered a constant for evaluation: the result of
evaluating it is the same record. This does not evaluate or even
examine the slots. See Self-Evaluating Forms.
7.1 Record Functions
- Function: recordp object ¶
This function returns t
if object is a record.
- Function: record type &rest objects ¶
This function creates and returns a record whose type is type
and remaining slots are the rest of the arguments, objects.
(record 'foo 23 [bar baz] "rats")
⇒ #s(foo 23 [bar baz] "rats")
- Function: make-record type length object ¶
This function returns a new record with type type and
length more slots, each initialized to object.
(setq sleepy (make-record 'foo 9 'Z))
⇒ #s(foo Z Z Z Z Z Z Z Z Z)
7.2 Backward Compatibility
Code compiled with older versions of cl-defstruct
that
doesn’t use records may run into problems when used in a new Emacs.
To alleviate this, Emacs detects when an old cl-defstruct
is
used, and enables a mode in which type-of
handles old struct
objects as if they were records.
- Function: cl-old-struct-compat-mode arg ¶
If arg is positive, enable backward compatibility with old-style
structs.
8 Hash Tables
A hash table is a very fast kind of lookup table, somewhat like an
alist (see Association Lists) in that it maps keys to
corresponding values. It differs from an alist in these ways:
- Lookup in a hash table is extremely fast for large tables—in fact, the
time required is essentially independent of how many elements are
stored in the table. For smaller tables (a few tens of elements)
alists may still be faster because hash tables have a more-or-less
constant overhead.
- The correspondences in a hash table are in no particular order.
- There is no way to share structure between two hash tables,
the way two alists can share a common tail.
Emacs Lisp provides a general-purpose hash table data type, along
with a series of functions for operating on them. Hash tables have a
special printed representation, which consists of ‘#s’ followed
by a list specifying the hash table properties and contents.
See Creating Hash Tables.
(Hash notation, the initial ‘#’ character used in the printed
representations of objects with no read representation, has nothing to
do with hash tables. See Printed Representation and Read Syntax.)
Obarrays are also a kind of hash table, but they are a different type
of object and are used only for recording interned symbols
(see Creating and Interning Symbols).
8.1 Creating Hash Tables
The principal function for creating a hash table is
make-hash-table
.
- Function: make-hash-table &rest keyword-args ¶
This function creates a new hash table according to the specified
arguments. The arguments should consist of alternating keywords
(particular symbols recognized specially) and values corresponding to
them.
Several keywords make sense in make-hash-table
, but the only two
that you really need to know about are :test
and :weakness
.
:test test
This specifies the method of key lookup for this hash table. The
default is eql
; eq
and equal
are other
alternatives:
eql
Keys which are numbers are the same if they are equal
, that
is, if they are equal in value and either both are integers or both
are floating point; otherwise, two distinct objects are never
the same.
eq
Any two distinct Lisp objects are different as keys.
equal
Two Lisp objects are the same, as keys, if they are equal
according to equal
.
You can use define-hash-table-test
(see Defining Hash Comparisons) to
define additional possibilities for test.
:weakness weak
The weakness of a hash table specifies whether the presence of a key or
value in the hash table preserves it from garbage collection.
The value, weak, must be one of nil
, key
,
value
, key-or-value
, key-and-value
, or t
which is an alias for key-and-value
. If weak is key
then the hash table does not prevent its keys from being collected as
garbage (if they are not referenced anywhere else); if a particular key
does get collected, the corresponding association is removed from the
hash table.
If weak is value
, then the hash table does not prevent
values from being collected as garbage (if they are not referenced
anywhere else); if a particular value does get collected, the
corresponding association is removed from the hash table.
If weak is key-and-value
or t
, both the key and
the value must be live in order to preserve the association. Thus,
the hash table does not protect either keys or values from garbage
collection; if either one is collected as garbage, that removes the
association.
If weak is key-or-value
, either the key or
the value can preserve the association. Thus, associations are
removed from the hash table when both their key and value would be
collected as garbage (if not for references from weak hash tables).
The default for weak is nil
, so that all keys and values
referenced in the hash table are preserved from garbage collection.
:size size
This specifies a hint for how many associations you plan to store in the
hash table. If you know the approximate number, you can make things a
little more efficient by specifying it this way. If you specify too
small a size, the hash table will grow automatically when necessary, but
doing that takes some extra time.
The default size is 65.
:rehash-size rehash-size
When you add an association to a hash table and the table is full,
it grows automatically. This value specifies how to make the hash table
larger, at that time.
If rehash-size is an integer, it should be positive, and the hash
table grows by adding approximately that much to the nominal size. If
rehash-size is floating point, it had better be greater
than 1, and the hash table grows by multiplying the old size by
approximately that number.
The default value is 1.5.
:rehash-threshold threshold
This specifies the criterion for when the hash table is full (so
it should be made larger). The value, threshold, should be a
positive floating-point number, no greater than 1. The hash table is
full whenever the actual number of entries exceeds the nominal size
multiplied by an approximation to this value. The default for
threshold is 0.8125.
You can also create a hash table using the printed representation
for hash tables. The Lisp reader can read this printed
representation, provided each element in the specified hash table has
a valid read syntax (see Printed Representation and Read Syntax). For instance,
the following specifies a hash table containing the keys
key1
and key2
(both symbols) associated with val1
(a symbol) and 300
(a number) respectively.
#s(hash-table size 30 data (key1 val1 key2 300))
Note, however, that when using this in Emacs Lisp code, it’s
undefined whether this creates a new hash table or not. If you want
to create a new hash table, you should always use
make-hash-table
(see Self-Evaluating Forms).
The printed representation for a hash table consists of ‘#s’
followed by a list beginning with ‘hash-table’. The rest of the
list should consist of zero or more property-value pairs specifying
the hash table’s properties and initial contents. The properties and
values are read literally. Valid property names are size
,
test
, weakness
, rehash-size
,
rehash-threshold
, and data
. The data
property
should be a list of key-value pairs for the initial contents; the
other properties have the same meanings as the matching
make-hash-table
keywords (:size
, :test
, etc.),
described above.
Note that you cannot specify a hash table whose initial contents
include objects that have no read syntax, such as buffers and frames.
Such objects may be added to the hash table after it is created.
8.2 Hash Table Access
This section describes the functions for accessing and storing
associations in a hash table. In general, any Lisp object can be used
as a hash key, unless the comparison method imposes limits. Any Lisp
object can also be used as the value.
- Function: gethash key table &optional default ¶
This function looks up key in table, and returns its
associated value—or default, if key has no
association in table.
- Function: puthash key value table ¶
This function enters an association for key in table, with
value value. If key already has an association in
table, value replaces the old associated value. This
function always returns value.
- Function: remhash key table ¶
This function removes the association for key from table, if
there is one. If key has no association, remhash
does
nothing.
Common Lisp note: In Common Lisp, remhash
returns
non-nil
if it actually removed an association and nil
otherwise. In Emacs Lisp, remhash
always returns nil
.
- Function: clrhash table ¶
This function removes all the associations from hash table table,
so that it becomes empty. This is also called clearing the hash
table. clrhash
returns the empty table.
- Function: maphash function table ¶
This function calls function once for each of the associations in
table. The function function should accept two
arguments—a key listed in table, and its associated
value. maphash
returns nil
.
8.3 Defining Hash Comparisons
You can define new methods of key lookup by means of
define-hash-table-test
. In order to use this feature, you need
to understand how hash tables work, and what a hash code means.
You can think of a hash table conceptually as a large array of many
slots, each capable of holding one association. To look up a key,
gethash
first computes an integer, the hash code, from the key.
It can reduce this integer modulo the length of the array, to produce an
index in the array. Then it looks in that slot, and if necessary in
other nearby slots, to see if it has found the key being sought.
Thus, to define a new method of key lookup, you need to specify both a
function to compute the hash code from a key, and a function to compare
two keys directly. The two functions should be consistent with each
other: that is, two keys’ hash codes should be the same if the keys
compare as equal. Also, since the two functions can be called at any
time (such as by the garbage collector), the functions should be free
of side effects and should return quickly, and their behavior should
depend on only on properties of the keys that do not change.
- Function: define-hash-table-test name test-fn hash-fn ¶
This function defines a new hash table test, named name.
After defining name in this way, you can use it as the test
argument in make-hash-table
. When you do that, the hash table
will use test-fn to compare key values, and hash-fn to compute
a hash code from a key value.
The function test-fn should accept two arguments, two keys, and
return non-nil
if they are considered the same.
The function hash-fn should accept one argument, a key, and return
an integer that is the hash code of that key. For good results, the
function should use the whole range of fixnums for hash codes,
including negative fixnums.
The specified functions are stored in the property list of name
under the property hash-table-test
; the property value’s form is
(test-fn hash-fn)
.
- Function: sxhash-equal obj ¶
This function returns a hash code for Lisp object obj.
This is an integer that reflects the contents of obj
and the other Lisp objects it points to.
If two objects obj1 and obj2 are equal
, then
(sxhash-equal obj1)
and (sxhash-equal obj2)
are the same integer.
If the two objects are not equal
, the values returned by
sxhash-equal
are usually different, but not always.
sxhash-equal
is designed to be reasonably fast (since it’s used
for indexing hash tables) so it won’t recurse deeply into nested
structures. In addition; once in a rare while, by luck, you will
encounter two distinct-looking simple objects that give the same
result from sxhash-equal
. So you can’t, in general, use
sxhash-equal
to check whether an object has changed.
Common Lisp note: In Common Lisp a similar function is called
sxhash
. Emacs provides this name as a compatibility alias for
sxhash-equal
.
- Function: sxhash-eq obj ¶
This function returns a hash code for Lisp object obj. Its
result reflects identity of obj, but not its contents.
If two objects obj1 and obj2 are eq
, then
(sxhash-eq obj1)
and (sxhash-eq obj2)
are
the same integer.
- Function: sxhash-eql obj ¶
This function returns a hash code for Lisp object obj suitable
for eql
comparison. I.e. it reflects identity of obj
except for the case where the object is a bignum or a float number,
in which case a hash code is generated for the value.
If two objects obj1 and obj2 are eql
, then
(sxhash-eql obj1)
and (sxhash-eql obj2)
are
the same integer.
This example creates a hash table whose keys are strings that are
compared case-insensitively.
(defun string-hash-ignore-case (a)
(sxhash-equal (upcase a)))
(define-hash-table-test 'ignore-case
'string-equal-ignore-case 'string-hash-ignore-case)
(make-hash-table :test 'ignore-case)
Here is how you could define a hash table test equivalent to the
predefined test value equal
. The keys can be any Lisp object,
and equal-looking objects are considered the same key.
(define-hash-table-test 'contents-hash 'equal 'sxhash-equal)
(make-hash-table :test 'contents-hash)
Lisp programs should not rely on hash codes being preserved
between Emacs sessions, as the implementation of the hash functions
uses some details of the object storage that can change between
sessions and between different architectures.
8.4 Other Hash Table Functions
Here are some other functions for working with hash tables.
- Function: hash-table-p table ¶
This returns non-nil
if table is a hash table object.
- Function: copy-hash-table table ¶
This function creates and returns a copy of table. Only the table
itself is copied—the keys and values are shared.
- Function: hash-table-count table ¶
This function returns the actual number of entries in table.
- Function: hash-table-test table ¶
This returns the test value that was given when table was
created, to specify how to hash and compare keys. See
make-hash-table
(see Creating Hash Tables).
- Function: hash-table-weakness table ¶
This function returns the weak value that was specified for hash
table table.
- Function: hash-table-rehash-size table ¶
This returns the rehash size of table.
- Function: hash-table-rehash-threshold table ¶
This returns the rehash threshold of table.
- Function: hash-table-size table ¶
This returns the current nominal size of table.
9 Symbols
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
:
- Function: symbolp object ¶
This function returns t
if object is a symbol, nil
otherwise.
9.1 Symbol Components
Each symbol has four components (or “cells”), each of which
references another object:
- Print name ¶
The symbol’s name.
- Value ¶
The symbol’s current value as a variable.
- Function ¶
The symbol’s function definition. It can also hold a symbol, a
keymap, or a keyboard macro.
- Property list ¶
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 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
symbol nil
.) Examining a function or 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, variables
names and function names 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>
9.2 Defining Symbols
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.
9.3 Creating and Interning Symbols
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 reads all the characters of that name. Then it
looks up that name in a table called an obarray to find the
symbol that the programmer meant. The technique used in this lookup
is called “hashing”, an efficient method of looking something up by
converting a sequence of characters to a number, known as a “hash
code”. For example, instead of searching a telephone book cover to
cover when looking up Jan Jones, you start with the J’s and go from
there. That is a simple version of hashing. Each element of the
obarray is a bucket which holds all the symbols with a given
hash code; to look for a given name, it is sufficient to look through
all the symbols in the bucket for that name’s hash code. (The same
idea is used for general Emacs hash tables, but they are a different
data type; see Hash Tables.)
When looking up names, 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. Of course, the reader needs to be aware of some pre-established
context about such shorthands, much as one needs context to be to able
to refer uniquely to Jan Jones by just the name “Jan”: it’s probably
fine when amongst the Joneses, or when Jan has been mentioned
recently, but very ambiguous in any other situation.
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.
In Emacs Lisp, an obarray is actually a vector. Each element of the
vector is a bucket; its value is either an interned symbol whose name
hashes to that bucket, or 0 if the bucket is empty. Each interned
symbol has an internal link (invisible to the user) to the next symbol
in the bucket. Because these links are invisible, there is no way to
find all the symbols in an obarray except using mapatoms
(below).
The order of symbols in a bucket is not significant.
In an empty obarray, every element is 0, so you can create an obarray
with (make-vector length 0)
. This is the only
valid way to create an obarray. Prime numbers as lengths tend
to result in good hashing; lengths one less than a power of two are also
good.
Do not try to put symbols in an obarray yourself. This does
not work—only intern
can enter a symbol in an obarray properly.
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).
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 a vector.
- Function: symbol-name symbol ¶
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.
- Function: make-symbol name ¶
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
- Function: gensym &optional prefix ¶
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
.
- Function: intern name &optional obarray ¶
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 intern
must be a string, not a symbol.
- Function: intern-soft name &optional obarray ¶
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
- Variable: obarray ¶
This variable is the standard obarray for use by intern
and
read
.
- Function: mapatoms function &optional obarray ¶
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
.
- Function: unintern symbol obarray ¶
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
.
9.4 Symbol Properties
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).
9.4.1 Accessing Symbol Properties
The following functions can be used to access symbol properties.
- Function: get symbol property ¶
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.
- Function: put symbol property value ¶
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))
- Function: symbol-plist symbol ¶
This function returns the property list of symbol.
- Function: setplist symbol plist ¶
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)))
- Function: function-get symbol property &optional autoload ¶
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.
- Function: function-put function property value ¶
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.
9.4.2 Standard Symbol Properties
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-binding
This property value specifies the preferred key binding, when showing
documentation, for the named function. See Substituting Key Bindings in Documentation.
char-table-extra-slots
The value, if non-nil
, specifies the number of extra slots in
the named char-table type. See Char-Tables.
customized-face
face-defface-spec
saved-face
theme-face
These 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-value
saved-value
standard-value
theme-value
These 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-name
This property is used to 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. For example, a define-derived-mode
(see Defining Derived Modes) might define a mode-specific function or a
variable implicitly; or your Lisp program might generate a run-time
call to defun
to define a function (see Defining Functions). In these and similar cases, the definition-name
property of the symbol should be another symbol whose definition can
be found by textual search and whose code defines the original symbol.
In the example with define-derived-mode
, the value of this
property of the functions and variables it defines should be the mode
symbol. The Emacs Help commands such as C-h f (see Help in The GNU Emacs Manual) use this property to show the definition
of a symbol via a button in the *Help* buffer where the
symbol’s documentation is shown.
disabled
If the value is non-nil
, the named function is disabled as a
command. See Disabling Commands.
face-documentation
The value stores the documentation string of the named face. This is
set automatically by defface
. See Defining Faces.
history-length
The value, if non-nil
, specifies the maximum minibuffer history
length for the named history list variable. See Minibuffer History.
interactive-form
The value is an interactive form for the named function. Normally,
you should not set this directly; use the interactive
special
form instead. See Interactive Call.
menu-enable
The value is an expression for determining whether the named menu item
should be enabled in menus. See Simple Menu Items.
mode-class
If the value is special
, the named major mode is special.
See Major Mode Conventions.
permanent-local
If 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-hook
If 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. Not to be confused with pure storage (see Pure Storage).
risky-local-variable
If 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-function
If the value is non-nil
, the named function is safe to call in
file-local evaluation forms. See File Local Variables.
safe-local-variable
The value specifies a function for determining safe file-local values
for the named variable. See File Local Variables. Since this
value is consulted when loading files, the function should be
efficient and should ideally not lead to loading any libraries to
determine the safeness (e.g., it should not be an autoloaded function).
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).
undo-inhibit-region
If 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-documentation
If non-nil
, this specifies the named variable’s documentation
string. This is set automatically by defvar
and related
functions. See Defining Faces.
9.5 Shorthands
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.
- Variable: read-symbol-shorthands ¶
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:
9.5.1 Exceptions
There are two exceptions to rules governing Shorthand transformations:
- Symbol forms comprised entirely of characters in the Emacs Lisp symbol
constituent class (see Table of Syntax Classes) are not transformed.
For example, it’s possible to use
-
or /=
as shorthand
prefixes, but that won’t shadow the arithmetic functions of
those names.
- Symbol forms whose names start with ‘#_’ are not transformed.
9.6 Symbols with Position
A symbol with position is a symbol, the bare symbol,
together with an unsigned integer called the position. These
objects are intended for use by the byte compiler, which records in
them the position of each symbol occurrence and uses those positions
in warning and error messages.
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.
For most purposes, when the flag variable
symbols-with-pos-enabled
is non-nil
, symbols with
positions behave just as bare symbols do. For example, ‘(eq
#<symbol foo at 12345> foo)’ has a value t
when that variable
is set (but nil
when it isn’t set). Most of the time in Emacs this
variable is nil
, but the byte compiler binds it to t
when it runs.
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
.
- Variable: symbols-with-pos-enabled ¶
When this variable is non-nil
, symbols with position behave
like the contained bare symbol. Emacs runs a little more slowly in
this case.
- Variable: print-symbols-bare ¶
When bound to non-nil
, the Lisp printer prints only the bare symbol of
a symbol with position, ignoring the position.
- Function: symbol-with-pos-p symbol. ¶
This function returns t
if symbol is a symbol with
position, nil
otherwise.
- Function: bare-symbol symbol ¶
This function returns the bare symbol contained in symbol, or
symbol itself if it is already a bare symbol. For any other
type of object, it signals an error.
- Function: symbol-with-pos-pos symbol ¶
This function returns the position, a number, from a symbol with
position. For any other type of object, it signals an error.
- Function: position-symbol sym pos ¶
Make a new symbol with position. sym is either a bare symbol or
a symbol with position, and supplies the symbol part of the new
object. pos is either an integer which becomes the number part
of the new object, or a symbol with position whose position is used.
Emacs signals an error if either argument is invalid.
10 Evaluation
The evaluation of expressions in Emacs Lisp is performed by the
Lisp interpreter—a program that receives a Lisp object as input
and computes its value as an expression. How it does this depends
on the data type of the object, according to rules described in this
chapter. The interpreter runs automatically to evaluate portions of
your program, but can also be called explicitly via the Lisp primitive
function eval
.
10.1 Introduction to Evaluation
The Lisp interpreter, or evaluator, is the part of Emacs that
computes the value of an expression that is given to it. When a
function written in Lisp is called, the evaluator computes the value
of the function by evaluating the expressions in the function body.
Thus, running any Lisp program really means running the Lisp
interpreter.
A Lisp object that is intended for evaluation is called a form
or expression7. The fact that forms are data objects
and not merely text is one of the fundamental differences between
Lisp-like languages and typical programming languages. Any object can
be evaluated, but in practice only numbers, symbols, lists and strings
are evaluated very often.
In subsequent sections, we will describe the details of what
evaluation means for each kind of form.
It is very common to read a Lisp form and then evaluate the form,
but reading and evaluation are separate activities, and either can be
performed alone. Reading per se does not evaluate anything; it
converts the printed representation of a Lisp object to the object
itself. It is up to the caller of read
to specify whether this
object is a form to be evaluated, or serves some entirely different
purpose. See Input Functions.
Evaluation is a recursive process, and evaluating a form often
involves evaluating parts within that form. For instance, when you
evaluate a function call form such as (car x)
, Emacs
first evaluates the argument (the subform x
). After evaluating
the argument, Emacs executes the function (car
), and if
the function is written in Lisp, execution works by evaluating the
body of the function (in this example, however, car
is
not a Lisp function; it is a primitive function implemented in C).
See Functions, for more information about functions and function
calls.
Evaluation takes place in a context called the environment,
which consists of the current values and bindings of all Lisp
variables (see Variables).8 Whenever a form refers to a
variable without creating a new binding for it, the variable evaluates
to the value given by the current environment. Evaluating a form may
also temporarily alter the environment by binding variables
(see Local Variables).
Evaluating a form may also make changes that persist; these changes
are called side effects. An example of a form that produces a
side effect is (setq foo 1)
.
Do not confuse evaluation with command key interpretation. The
editor command loop translates keyboard input into a command (an
interactively callable function) using the active keymaps, and then
uses call-interactively
to execute that command. Executing the
command usually involves evaluation, if the command is written in
Lisp; however, this step is not considered a part of command key
interpretation. See Command Loop.
10.2 Kinds of Forms
A Lisp object that is intended to be evaluated is called a
form (or an expression). How Emacs evaluates a form
depends on its data type. Emacs has three different kinds of form
that are evaluated differently: symbols, lists, and all other
types. This section describes all three kinds, one by one, starting
with the other types, which are self-evaluating forms.
10.2.3 Classification of List Forms
A form that is a nonempty list is either a function call, a macro
call, or a special form, according to its first element. These three
kinds of forms are evaluated in different ways, described below. The
remaining list elements constitute the arguments for the function,
macro, or special form.
The first step in evaluating a nonempty list is to examine its first
element. This element alone determines what kind of form the list is
and how the rest of the list is to be processed. The first element is
not evaluated, as it would be in some Lisp dialects such as
Scheme.
10.2.4 Symbol Function Indirection
If the first element of the list is a symbol then evaluation
examines the symbol’s function cell, and uses its contents instead of
the original symbol. If the contents are another symbol, this
process, called symbol function indirection, is repeated until
it obtains a non-symbol. See Naming a Function, for more information
about symbol function indirection.
One possible consequence of this process is an infinite loop, in the
event that a symbol’s function cell refers to the same symbol.
Otherwise, we eventually obtain a non-symbol, which ought to be a
function or other suitable object.
More precisely, we should now have a Lisp function (a lambda
expression), a byte-code function, a primitive function, a Lisp macro,
a special form, or an autoload object. Each of these types is a case
described in one of the following sections. If the object is not one
of these types, Emacs signals an invalid-function
error.
The following example illustrates the symbol indirection process.
We use fset
to set the function cell of a symbol and
symbol-function
to get the function cell contents
(see Accessing Function Cell Contents). Specifically, we store the symbol
car
into the function cell of first
, and the symbol
first
into the function cell of erste
.
;; Build this function cell linkage:
;; ------------- ----- ------- -------
;; | #<subr car> | <-- | car | <-- | first | <-- | erste |
;; ------------- ----- ------- -------
(symbol-function 'car)
⇒ #<subr car>
(fset 'first 'car)
⇒ car
(fset 'erste 'first)
⇒ first
(erste '(1 2 3)) ; Call the function referenced by erste
.
⇒ 1
By contrast, the following example calls a function without any symbol
function indirection, because the first element is an anonymous Lisp
function, not a symbol.
((lambda (arg) (erste arg))
'(1 2 3))
⇒ 1
Executing the function itself evaluates its body; this does involve
symbol function indirection when calling erste
.
This form is rarely used and is now deprecated. Instead, you should write it
as:
(funcall (lambda (arg) (erste arg))
'(1 2 3))
or just
(let ((arg '(1 2 3))) (erste arg))
The built-in function indirect-function
provides an easy way to
perform symbol function indirection explicitly.
- Function: indirect-function function &optional noerror ¶
This function returns the meaning of function as a function. If
function is a symbol, then it finds function’s function
definition and starts over with that value. If function is not a
symbol, then it returns function itself.
This function returns nil
if the final symbol is unbound. It
signals a cyclic-function-indirection
error if there is a loop
in the chain of symbols.
The optional argument noerror is obsolete, kept for backward
compatibility, and has no effect.
Here is how you could define indirect-function
in Lisp:
(defun indirect-function (function)
(if (and function
(symbolp function))
(indirect-function (symbol-function function))
function))
10.2.8 Autoloading
The autoload feature allows you to call a function or macro
whose function definition has not yet been loaded into Emacs. It
specifies which file contains the definition. When an autoload object
appears as a symbol’s function definition, calling that symbol as a
function automatically loads the specified file; then it calls the
real definition loaded from that file. The way to arrange for an
autoload object to appear as a symbol’s function definition is
described in Autoload.
10.3 Quoting
The special form quote
returns its single argument, as written,
without evaluating it. This provides a way to include constant symbols
and lists, which are not self-evaluating objects, in a program. (It is
not necessary to quote self-evaluating objects such as numbers, strings,
and vectors.)
- Special Form: quote object ¶
This special form returns object, without evaluating it.
The returned value might be shared and should not be modified.
See Self-Evaluating Forms.
Because quote
is used so often in programs, Lisp provides a
convenient read syntax for it. An apostrophe character (‘'’)
followed by a Lisp object (in read syntax) expands to a list whose first
element is quote
, and whose second element is the object. Thus,
the read syntax 'x
is an abbreviation for (quote x)
.
Here are some examples of expressions that use quote
:
(quote (+ 1 2))
⇒ (+ 1 2)
(quote foo)
⇒ foo
'foo
⇒ foo
''foo
⇒ 'foo
'(quote foo)
⇒ 'foo
['foo]
⇒ ['foo]
Although the expressions (list '+ 1 2)
and '(+ 1 2)
both yield lists equal to (+ 1 2)
, the former yields a
freshly-minted mutable list whereas the latter yields a list
built from conses that might be shared and should not be modified.
See Self-Evaluating Forms.
Other quoting constructs include function
(see Anonymous Functions), which causes an anonymous lambda expression written in Lisp
to be compiled, and ‘`’ (see Backquote), which is used to quote
only part of a list, while computing and substituting other parts.
10.4 Backquote
Backquote constructs allow you to quote a list, but
selectively evaluate elements of that list. In the simplest case, it
is identical to the special form
quote
(described in the previous section; see Quoting).
For example, these two forms yield identical results:
`(a list of (+ 2 3) elements)
⇒ (a list of (+ 2 3) elements)
'(a list of (+ 2 3) elements)
⇒ (a list of (+ 2 3) elements)
The special marker ‘,’ inside of the argument to backquote
indicates a value that isn’t constant. The Emacs Lisp evaluator
evaluates the argument of ‘,’, and puts the value in the list
structure:
`(a list of ,(+ 2 3) elements)
⇒ (a list of 5 elements)
Substitution with ‘,’ is allowed at deeper levels of the list
structure also. For example:
`(1 2 (3 ,(+ 4 5)))
⇒ (1 2 (3 9))
You can also splice an evaluated value into the resulting list,
using the special marker ‘,@’. The elements of the spliced list
become elements at the same level as the other elements of the resulting
list. The equivalent code without using ‘`’ is often unreadable.
Here are some examples:
(setq some-list '(2 3))
⇒ (2 3)
(cons 1 (append some-list '(4) some-list))
⇒ (1 2 3 4 2 3)
`(1 ,@some-list 4 ,@some-list)
⇒ (1 2 3 4 2 3)
(setq list '(hack foo bar))
⇒ (hack foo bar)
(cons 'use
(cons 'the
(cons 'words (append (cdr list) '(as elements)))))
⇒ (use the words foo bar as elements)
`(use the words ,@(cdr list) as elements)
⇒ (use the words foo bar as elements)
If a subexpression of a backquote construct has no substitutions or
splices, it acts like quote
in that it yields conses,
vectors and strings that might be shared and should not be modified.
See Self-Evaluating Forms.
10.5 Eval
Most often, forms are evaluated automatically, by virtue of their
occurrence in a program being run. On rare occasions, you may need to
write code that evaluates a form that is computed at run time, such as
after reading a form from text being edited or getting one from a
property list. On these occasions, use the eval
function.
Often eval
is not needed and something else should be used instead.
For example, to get the value of a variable, while eval
works,
symbol-value
is preferable; or rather than store expressions
in a property list that then need to go through eval
, it is better to
store functions instead that are then passed to funcall
.
The functions and variables described in this section evaluate forms,
specify limits to the evaluation process, or record recently returned
values. Loading a file also does evaluation (see Loading).
It is generally cleaner and more flexible to store a function in a
data structure, and call it with funcall
or apply
, than
to store an expression in the data structure and evaluate it. Using
functions provides the ability to pass information to them as
arguments.
- Function: eval form &optional lexical ¶
This is the basic function for evaluating an expression. It evaluates
form in the current environment, and returns the result. The
type of the form object determines how it is evaluated.
See Kinds of Forms.
The argument lexical specifies the scoping rule for local
variables (see Scoping Rules for Variable Bindings). If it is omitted or nil
,
that means to evaluate form using the default dynamic scoping
rule. If it is t
, that means to use the lexical scoping rule.
The value of lexical can also be a non-empty alist specifying a
particular lexical environment for lexical bindings; however,
this feature is only useful for specialized purposes, such as in Emacs
Lisp debuggers. See Lexical Binding.
Since eval
is a function, the argument expression that appears
in a call to eval
is evaluated twice: once as preparation before
eval
is called, and again by the eval
function itself.
Here is an example:
(setq foo 'bar)
⇒ bar
(setq bar 'baz)
⇒ baz
;; Here eval
receives argument foo
(eval 'foo)
⇒ bar
;; Here eval
receives argument bar
, which is the value of foo
(eval foo)
⇒ baz
The number of currently active calls to eval
is limited to
max-lisp-eval-depth
(see below).
- Command: eval-region start end &optional stream read-function ¶
This function evaluates the forms in the current buffer in the region
defined by the positions start and end. It reads forms from
the region and calls eval
on them until the end of the region is
reached, or until an error is signaled and not handled.
By default, eval-region
does not produce any output. However,
if stream is non-nil
, any output produced by output
functions (see Output Functions), as well as the values that
result from evaluating the expressions in the region are printed using
stream. See Output Streams.
If read-function is non-nil
, it should be a function,
which is used instead of read
to read expressions one by one.
This function is called with one argument, the stream for reading
input. You can also use the variable load-read-function
(see How Programs Do Loading)
to specify this function, but it is more robust to use the
read-function argument.
eval-region
does not move point. It always returns nil
.
- Command: eval-buffer &optional buffer-or-name stream filename unibyte print ¶
This is similar to eval-region
, but the arguments provide
different optional features. eval-buffer
operates on the
entire accessible portion of buffer buffer-or-name
(see Narrowing in The GNU Emacs Manual).
buffer-or-name can be a buffer, a buffer name (a string), or
nil
(or omitted), which means to use the current buffer.
stream is used as in eval-region
, unless stream is
nil
and print non-nil
. In that case, values that
result from evaluating the expressions are still discarded, but the
output of the output functions is printed in the echo area.
filename is the file name to use for load-history
(see Unloading), and defaults to buffer-file-name
(see Buffer File Name). If unibyte is non-nil
,
read
converts strings to unibyte whenever possible.
- User Option: max-lisp-eval-depth ¶
This variable defines the maximum depth allowed in calls to eval
,
apply
, and funcall
before an error is signaled (with error
message "Lisp nesting exceeds max-lisp-eval-depth"
).
This limit, with the associated error when it is exceeded, is how
Emacs Lisp avoids infinite recursion on an ill-defined function. If
you increase the value of max-lisp-eval-depth
too much, such
code can cause stack overflow instead. On some systems, this overflow
can be handled. In that case, normal Lisp evaluation is interrupted
and control is transferred back to the top level command loop
(top-level
). Note that there is no way to enter Emacs Lisp
debugger in this situation. See Entering the Debugger on an Error.
The depth limit counts internal uses of eval
, apply
, and
funcall
, such as for calling the functions mentioned in Lisp
expressions, and recursive evaluation of function call arguments and
function body forms, as well as explicit calls in Lisp code.
The default value of this variable is 1600. If you set it to a value
less than 100, Lisp will reset it to 100 if the given value is
reached. Entry to the Lisp debugger increases the value, if there is
little room left, to make sure the debugger itself has room to
execute.
- Variable: values ¶
The value of this variable is a list of the values returned by all the
expressions that were read, evaluated, and printed from buffers
(including the minibuffer) by the standard Emacs commands which do
this. (Note that this does not include evaluation in
*ielm* buffers, nor evaluation using C-j, C-x C-e,
and similar evaluation commands in lisp-interaction-mode
.)
This variable is obsolete, and will be removed in a future version,
since it constantly enlarges the memory footprint of the Emacs
process. For that reason, we recommend against using it.
The elements of values
are ordered most recent first.
(setq x 1)
⇒ 1
(list 'A (1+ 2) auto-save-default)
⇒ (A 3 t)
values
⇒ ((A 3 t) 1 …)
This variable could be useful for referring back to values of forms
recently evaluated. It is generally a bad idea to print the value of
values
itself, since this may be very long. Instead, examine
particular elements, like this:
;; Refer to the most recent evaluation result.
(nth 0 values)
⇒ (A 3 t)
;; That put a new element on,
;; so all elements move back one.
(nth 1 values)
⇒ (A 3 t)
;; This gets the element that was next-to-most-recent
;; before this example.
(nth 3 values)
⇒ 1
10.6 Deferred and Lazy Evaluation
Sometimes it is useful to delay the evaluation of an expression, for
example if you want to avoid performing a time-consuming calculation
if it turns out that the result is not needed in the future of the
program. The thunk library provides the following functions
and macros to support such deferred evaluation:
- Macro: thunk-delay forms… ¶
Return a thunk for evaluating the forms. A thunk is a
closure (see Closures) that inherits the lexical environment of the
thunk-delay
call. Using this macro requires
lexical-binding
.
- Function: thunk-force thunk ¶
Force thunk to perform the evaluation of the forms specified in
the thunk-delay
that created the thunk. The result of the
evaluation of the last form is returned. The thunk also
“remembers” that it has been forced: Any further calls of
thunk-force
with the same thunk will just return the same
result without evaluating the forms again.
- Macro: thunk-let (bindings…) forms… ¶
This macro is analogous to let
but creates “lazy” variable
bindings. Any binding has the form (symbol value-form)
. Unlike let
, the evaluation of any
value-form is deferred until the binding of the according
symbol is used for the first time when evaluating the
forms. Any value-form is evaluated at most once. Using
this macro requires lexical-binding
.
Example:
(defun f (number)
(thunk-let ((derived-number
(progn (message "Calculating 1 plus 2 times %d" number)
(1+ (* 2 number)))))
(if (> number 10)
derived-number
number)))
(f 5)
⇒ 5
(f 12)
-| Calculating 1 plus 2 times 12
⇒ 25
Because of the special nature of lazily bound variables, it is an error
to set them (e.g. with setq
).
- Macro: thunk-let* (bindings…) forms… ¶
This is like thunk-let
but any expression in bindings is allowed
to refer to preceding bindings in this thunk-let*
form. Using
this macro requires lexical-binding
.
(thunk-let* ((x (prog2 (message "Calculating x...")
(+ 1 1)
(message "Finished calculating x")))
(y (prog2 (message "Calculating y...")
(+ x 1)
(message "Finished calculating y")))
(z (prog2 (message "Calculating z...")
(+ y 1)
(message "Finished calculating z")))
(a (prog2 (message "Calculating a...")
(+ z 1)
(message "Finished calculating a"))))
(* z x))
-| Calculating z...
-| Calculating y...
-| Calculating x...
-| Finished calculating x
-| Finished calculating y
-| Finished calculating z
⇒ 8
thunk-let
and thunk-let*
use thunks implicitly: their
expansion creates helper symbols and binds them to thunks wrapping the
binding expressions. All references to the original variables in the
body forms are then replaced by an expression that calls
thunk-force
with the according helper variable as the argument.
So, any code using thunk-let
or thunk-let*
could be
rewritten to use thunks, but in many cases using these macros results
in nicer code than using thunks explicitly.
11 Control Structures
A Lisp program consists of a set of expressions, or
forms (see Kinds of Forms). We control the order of execution of
these forms by enclosing them in control structures. Control
structures are special forms which control when, whether, or how many
times to execute the forms they contain.
The simplest order of execution is sequential execution: first form
a, then form b, and so on. This is what happens when you
write several forms in succession in the body of a function, or at top
level in a file of Lisp code—the forms are executed in the order
written. We call this textual order. For example, if a function
body consists of two forms a and b, evaluation of the
function evaluates first a and then b. The result of
evaluating b becomes the value of the function.
Explicit control structures make possible an order of execution other
than sequential.
Emacs Lisp provides several kinds of control structure, including
other varieties of sequencing, conditionals, iteration, and (controlled)
jumps—all discussed below. The built-in control structures are
special forms since their subforms are not necessarily evaluated or not
evaluated sequentially. You can use macros to define your own control
structure constructs (see Macros).
11.1 Sequencing
Evaluating forms in the order they appear is the most common way
control passes from one form to another. In some contexts, such as in a
function body, this happens automatically. Elsewhere you must use a
control structure construct to do this: progn
, the simplest
control construct of Lisp.
A progn
special form looks like this:
and it says to execute the forms a, b, c, and so on, in
that order. These forms are called the body of the progn
form.
The value of the last form in the body becomes the value of the entire
progn
. (progn)
returns nil
.
In the early days of Lisp, progn
was the only way to execute
two or more forms in succession and use the value of the last of them.
But programmers found they often needed to use a progn
in the
body of a function, where (at that time) only one form was allowed. So
the body of a function was made into an implicit progn
:
several forms are allowed just as in the body of an actual progn
.
Many other control structures likewise contain an implicit progn
.
As a result, progn
is not used as much as it was many years ago.
It is needed now most often inside an unwind-protect
, and
,
or
, or in the then-part of an if
.
- Special Form: progn forms… ¶
This special form evaluates all of the forms, in textual
order, returning the result of the final form.
(progn (print "The first form")
(print "The second form")
(print "The third form"))
-| "The first form"
-| "The second form"
-| "The third form"
⇒ "The third form"
Two other constructs likewise evaluate a series of forms but return
different values:
- Special Form: prog1 form1 forms… ¶
This special form evaluates form1 and all of the forms, in
textual order, returning the result of form1.
(prog1 (print "The first form")
(print "The second form")
(print "The third form"))
-| "The first form"
-| "The second form"
-| "The third form"
⇒ "The first form"
Here is a way to remove the first element from a list in the variable
x
, then return the value of that former element:
(prog1 (car x) (setq x (cdr x)))
- Special Form: prog2 form1 form2 forms… ¶
This special form evaluates form1, form2, and all of the
following forms, in textual order, returning the result of
form2.
(prog2 (print "The first form")
(print "The second form")
(print "The third form"))
-| "The first form"
-| "The second form"
-| "The third form"
⇒ "The second form"
11.2 Conditionals
Conditional control structures choose among alternatives. Emacs Lisp
has five conditional forms: if
, which is much the same as in
other languages; when
and unless
, which are variants of
if
; cond
, which is a generalized case statement;
and pcase
, which is a generalization of cond
(see Pattern-Matching Conditional).
- Special Form: if condition then-form else-forms… ¶
if
chooses between the then-form and the else-forms
based on the value of condition. If the evaluated condition is
non-nil
, then-form is evaluated and the result returned.
Otherwise, the else-forms are evaluated in textual order, and the
value of the last one is returned. (The else part of if
is
an example of an implicit progn
. See Sequencing.)
If condition has the value nil
, and no else-forms are
given, if
returns nil
.
if
is a special form because the branch that is not selected is
never evaluated—it is ignored. Thus, in this example,
true
is not printed because print
is never called:
(if nil
(print 'true)
'very-false)
⇒ very-false
- Macro: when condition then-forms… ¶
This is a variant of if
where there are no else-forms,
and possibly several then-forms. In particular,
is entirely equivalent to
(if condition (progn a b c) nil)
- Macro: unless condition forms… ¶
This is a variant of if
where there is no then-form:
is entirely equivalent to
- Special Form: cond clause… ¶
cond
chooses among an arbitrary number of alternatives. Each
clause in the cond
must be a list. The CAR of this
list is the condition; the remaining elements, if any, the
body-forms. Thus, a clause looks like this:
cond
tries the clauses in textual order, by evaluating the
condition of each clause. If the value of condition is
non-nil
, the clause succeeds; then cond
evaluates its
body-forms, and returns the value of the last of body-forms.
Any remaining clauses are ignored.
If the value of condition is nil
, the clause fails, so
the cond
moves on to the following clause, trying its condition.
A clause may also look like this:
Then, if condition is non-nil
when tested, the cond
form returns the value of condition.
If every condition evaluates to nil
, so that every clause
fails, cond
returns nil
.
The following example has four clauses, which test for the cases where
the value of x
is a number, string, buffer and symbol,
respectively:
(cond ((numberp x) x)
((stringp x) x)
((bufferp x)
(setq temporary-hack x) ; multiple body-forms
(buffer-name x)) ; in one clause
((symbolp x) (symbol-value x)))
Often we want to execute the last clause whenever none of the previous
clauses was successful. To do this, we use t
as the
condition of the last clause, like this: (t
body-forms)
. The form t
evaluates to t
, which is
never nil
, so this clause never fails, provided the cond
gets to it at all. For example:
(setq a 5)
(cond ((eq a 'hack) 'foo)
(t "default"))
⇒ "default"
This cond
expression returns foo
if the value of a
is hack
, and returns the string "default"
otherwise.
Any conditional construct can be expressed with cond
or with
if
. Therefore, the choice between them is a matter of style.
For example:
(if a b c)
≡
(cond (a b) (t c))
It can be convenient to bind variables in conjunction with using a
conditional. It’s often the case that you compute a value, and then
want to do something with that value if it’s non-nil
. The
straightforward way to do that is to just write, for instance:
(let ((result1 (do-computation)))
(when result1
(let ((result2 (do-more result1)))
(when result2
(do-something result2)))))
Since this is a very common pattern, Emacs provides a number of macros
to make this easier and more readable. The above can be written the
following way instead:
(when-let ((result1 (do-computation))
(result2 (do-more result1)))
(do-something result2))
There’s a number of variations on this theme, and they’re briefly
described below.
- Macro: if-let spec then-form else-forms... ¶
Evaluate each binding in spec in turn, like in let*
(see Local Variables), stopping if a binding value is nil
.
If all are non-nil
, return the value of then-form,
otherwise the last form in else-forms.
- Macro: when-let spec then-forms... ¶
Like if-let
, but without else-forms.
- Macro: while-let spec then-forms... ¶
Like when-let
, but repeat until a binding in spec is
nil
. The return value is always nil
.
11.3 Constructs for Combining Conditions
This section describes constructs that are often used together with
if
and cond
to express complicated conditions. The
constructs and
and or
can also be used individually as
kinds of multiple conditional constructs.
- Function: not condition ¶
This function tests for the falsehood of condition. It returns
t
if condition is nil
, and nil
otherwise.
The function not
is identical to null
, and we recommend
using the name null
if you are testing for an empty list or
nil
value.
- Special Form: and conditions… ¶
The and
special form tests whether all the conditions are
true. It works by evaluating the conditions one by one in the
order written.
If any of the conditions evaluates to nil
, then the result
of the and
must be nil
regardless of the remaining
conditions; so and
returns nil
right away, ignoring
the remaining conditions.
If all the conditions turn out non-nil
, then the value of
the last of them becomes the value of the and
form. Just
(and)
, with no conditions, returns t
, appropriate
because all the conditions turned out non-nil
. (Think
about it; which one did not?)
Here is an example. The first condition returns the integer 1, which is
not nil
. Similarly, the second condition returns the integer 2,
which is not nil
. The third condition is nil
, so the
remaining condition is never evaluated.
(and (print 1) (print 2) nil (print 3))
-| 1
-| 2
⇒ nil
Here is a more realistic example of using and
:
(if (and (consp foo) (eq (car foo) 'x))
(message "foo is a list starting with x"))
Note that (car foo)
is not executed if (consp foo)
returns
nil
, thus avoiding an error.
and
expressions can also be written using either if
or
cond
. Here’s how:
(and arg1 arg2 arg3)
≡
(if arg1 (if arg2 arg3))
≡
(cond (arg1 (cond (arg2 arg3))))
- Special Form: or conditions… ¶
The or
special form tests whether at least one of the
conditions is true. It works by evaluating all the
conditions one by one in the order written.
If any of the conditions evaluates to a non-nil
value, then
the result of the or
must be non-nil
; so or
returns
right away, ignoring the remaining conditions. The value it
returns is the non-nil
value of the condition just evaluated.
If all the conditions turn out nil
, then the or
expression returns nil
. Just (or)
, with no
conditions, returns nil
, appropriate because all the
conditions turned out nil
. (Think about it; which one
did not?)
For example, this expression tests whether x
is either
nil
or the integer zero:
Like the and
construct, or
can be written in terms of
cond
. For example:
(or arg1 arg2 arg3)
≡
(cond (arg1)
(arg2)
(arg3))
You could almost write or
in terms of if
, but not quite:
(if arg1 arg1
(if arg2 arg2
arg3))
This is not completely equivalent because it can evaluate arg1 or
arg2 twice. By contrast, (or arg1 arg2
arg3)
never evaluates any argument more than once.
- Function: xor condition1 condition2 ¶
This function returns the boolean exclusive-or of condition1 and
condition2. That is, xor
returns nil
if either
both arguments are nil
, or both are non-nil
. Otherwise,
it returns the value of that argument which is non-nil
.
Note that in contrast to or
, both arguments are always evaluated.
11.4 Pattern-Matching Conditional
Aside from the four basic conditional forms, Emacs Lisp also
has a pattern-matching conditional form, the pcase
macro,
a hybrid of cond
and cl-case
(see Conditionals in Common Lisp Extensions)
that overcomes their limitations and introduces
the pattern matching programming style.
The limitations that pcase
overcomes are:
- The
cond
form chooses among alternatives by evaluating the
predicate condition of each of its clauses
(see Conditionals). The primary limitation is that variables
let-bound in condition are not available to the clause’s
body-forms.
Another annoyance (more an inconvenience than a limitation)
is that when a series of condition predicates implement
equality tests, there is a lot of repeated code. (cl-case
solves this inconvenience.)
- The
cl-case
macro chooses among alternatives by evaluating
the equality of its first argument against a set of specific
values.
Its limitations are two-fold:
- The equality tests use
eql
.
- The values must be known and written in advance.
These render cl-case
unsuitable for strings or compound
data structures (e.g., lists or vectors). (cond
doesn’t have
these limitations, but it has others, see above.)
Conceptually, the pcase
macro borrows the first-arg focus
of cl-case
and the clause-processing flow of cond
,
replacing condition with a generalization of
the equality test which is a variant of pattern matching,
and adding facilities so that you can concisely express a
clause’s predicate, and arrange to share let-bindings between
a clause’s predicate and body-forms.
The concise expression of a predicate is known as a pattern.
When the predicate, called on the value of the first arg, returns
non-nil
, we say that “the pattern matches the value” (or
sometimes “the value matches the pattern”).
11.4.1 The pcase
macro
For background, See Pattern-Matching Conditional.
- Macro: pcase expression &rest clauses ¶
Each clause in clauses has the form:
(pattern body-forms…)
.
Evaluate expression to determine its value, expval.
Find the first clause in clauses whose pattern matches
expval and pass control to that clause’s body-forms.
If there is a match, the value of pcase
is the value
of the last of body-forms in the successful clause.
Otherwise, pcase
evaluates to nil
.
Each pattern has to be a pcase pattern, which can use
either one of the core patterns defined below, or one of the patterns
defined via pcase-defmacro
(see Extending pcase
).
The rest of this subsection describes different forms of core
patterns, presents some examples, and concludes with important caveats
on using the let-binding facility provided by some pattern forms. A
core pattern can have the following forms:
_ (underscore)
Matches any expval.
This is also known as don’t care or wildcard.
'val
Matches if expval equals val. The comparison is done as
if by equal
(see Equality Predicates).
keyword
integer
string
Matches if expval equals the literal object.
This is a special case of 'val
, above,
possible because literal objects of these types are self-quoting.
symbol
Matches any expval, and additionally let-binds symbol to
expval, such that this binding is available to
body-forms (see Dynamic Binding).
If symbol is part of a sequencing pattern seqpat
(e.g., by using and
, below), the binding is also available to
the portion of seqpat following the appearance of symbol.
This usage has some caveats, see caveats.
Two symbols to avoid are t
, which behaves like _
(above) and is deprecated, and nil
, which signals an error.
Likewise, it makes no sense to bind keyword symbols
(see Variables that Never Change).
`qpat
A backquote-style pattern. See Backquote-Style Patterns, for the
details.
(cl-type type)
Matches if expval is of type type, which is a type
descriptor as accepted by cl-typep
(see Type Predicates in Common
Lisp Extensions). Examples:
(cl-type integer)
(cl-type (integer 0 10))
(pred function)
Matches if the predicate function returns non-nil
when called on expval. The test can be negated with the syntax
(pred (not function))
.
The predicate function can have one of the following forms:
- function name (a symbol)
Call the named function with one argument, expval.
Example: integerp
- lambda expression
Call the anonymous function with one argument,
expval (see Lambda Expressions).
Example: (lambda (n) (= 42 n))
- function call with n args
Call the function (the first element of the function call)
with n arguments (the other elements) and an additional
n+1-th argument that is expval.
Example: (= 42)
In this example, the function is =
, n is one, and
the actual function call becomes: (= 42 expval)
.
(app function pattern)
Matches if function called on expval returns a
value that matches pattern.
function can take one of the forms described for pred
,
above. Unlike pred
, however, app
tests the result
against pattern, rather than against a boolean truth value.
(guard boolean-expression)
Matches if boolean-expression evaluates to non-nil
.
(let pattern expr)
Evaluates expr to get exprval and matches if exprval
matches pattern. (It is called let
because pattern
can bind symbols to values using symbol.)
A sequencing pattern (also known as seqpat) is a
pattern that processes its sub-pattern arguments in sequence.
There are two for pcase
: and
and or
.
They behave in a similar manner to the special forms
that share their name (see Constructs for Combining Conditions),
but instead of processing values, they process sub-patterns.
(and pattern1…)
Attempts to match pattern1…, in order, until one of them
fails to match. In that case, and
likewise fails to match, and
the rest of the sub-patterns are not tested. If all sub-patterns
match, and
matches.
(or pattern1 pattern2…)
Attempts to match pattern1, pattern2, …, in order,
until one of them succeeds. In that case, or
likewise matches,
and the rest of the sub-patterns are not tested.
To present a consistent environment
(see Introduction to Evaluation)
to body-forms (thus avoiding an evaluation error on match),
the set of variables bound by the pattern is the union of the
variables bound by each sub-pattern. If a variable is not bound by
the sub-pattern that matched, then it is bound to nil
.
(rx rx-expr…)
Matches strings against the regexp rx-expr…, using the
rx
regexp notation (see The rx
Structured Regexp Notation), as if by
string-match
.
In addition to the usual rx
syntax, rx-expr… can
contain the following constructs:
(let ref rx-expr…)
Bind the symbol ref to a submatch that matches
rx-expr.... ref is bound in body-forms to
the string of the submatch or nil
, but can also be used in
backref
.
(backref ref)
Like the standard backref
construct, but ref can here
also be a name introduced by a previous (let ref …)
construct.
Example: Advantage Over cl-case
Here’s an example that highlights some advantages pcase
has over cl-case
(see Conditionals in Common Lisp Extensions).
(pcase (get-return-code x)
;; string
((and (pred stringp) msg)
(message "%s" msg))
;; symbol
('success (message "Done!"))
('would-block (message "Sorry, can't do it now"))
('read-only (message "The schmilblick is read-only"))
('access-denied (message "You do not have the needed rights"))
;; default
(code (message "Unknown return code %S" code)))
With cl-case
, you would need to explicitly declare a local
variable code
to hold the return value of get-return-code
.
Also cl-case
is difficult to use with strings because it
uses eql
for comparison.
Example: Using and
A common idiom is to write a pattern starting with and
,
with one or more symbol sub-patterns providing bindings
to the sub-patterns that follow (as well as to the body forms).
For example, the following pattern matches single-digit integers.
(and
(pred integerp)
n ; bind n
to expval
(guard (<= -9 n 9)))
First, pred
matches if (integerp expval)
evaluates to non-nil
.
Next, n
is a symbol pattern that matches
anything and binds n
to expval.
Lastly, guard
matches if the boolean expression
(<= -9 n 9)
(note the reference to n
)
evaluates to non-nil
.
If all these sub-patterns match, and
matches.
Example: Reformulation with pcase
Here is another example that shows how to reformulate a simple
matching task from its traditional implementation
(function grok/traditional
) to one using
pcase
(function grok/pcase
).
The docstring for both these functions is:
“If OBJ is a string of the form "key:NUMBER", return NUMBER
(a string). Otherwise, return the list ("149" default).”
First, the traditional implementation (see Regular Expressions):
(defun grok/traditional (obj)
(if (and (stringp obj)
(string-match "^key:\\([[:digit:]]+\\)$" obj))
(match-string 1 obj)
(list "149" 'default)))
(grok/traditional "key:0") ⇒ "0"
(grok/traditional "key:149") ⇒ "149"
(grok/traditional 'monolith) ⇒ ("149" default)
The reformulation demonstrates symbol binding as well as
or
, and
, pred
, app
and let
.
(defun grok/pcase (obj)
(pcase obj
((or ; line 1
(and ; line 2
(pred stringp) ; line 3
(pred (string-match ; line 4
"^key:\\([[:digit:]]+\\)$")) ; line 5
(app (match-string 1) ; line 6
val)) ; line 7
(let val (list "149" 'default))) ; line 8
val))) ; line 9
(grok/pcase "key:0") ⇒ "0"
(grok/pcase "key:149") ⇒ "149"
(grok/pcase 'monolith) ⇒ ("149" default)
The bulk of grok/pcase
is a single clause of a pcase
form, the pattern on lines 1-8, the (single) body form on line 9.
The pattern is or
, which tries to match in turn its argument
sub-patterns, first and
(lines 2-7), then let
(line 8),
until one of them succeeds.
As in the previous example (see Example 1),
and
begins with a pred
sub-pattern to ensure
the following sub-patterns work with an object of the correct
type (string, in this case). If (stringp expval)
returns nil
, pred
fails, and thus and
fails, too.
The next pred
(lines 4-5) evaluates
(string-match RX expval)
and matches if the result is non-nil
, which means
that expval has the desired form: key:NUMBER
.
Again, failing this, pred
fails and and
, too.
Lastly (in this series of and
sub-patterns), app
evaluates (match-string 1 expval)
(line 6)
to get a temporary value tmp (i.e., the “NUMBER” substring)
and tries to match tmp against pattern val
(line 7).
Since that is a symbol pattern, it matches unconditionally
and additionally binds val
to tmp.
Now that app
has matched, all and
sub-patterns
have matched, and so and
matches.
Likewise, once and
has matched, or
matches
and does not proceed to try sub-pattern let
(line 8).
Let’s consider the situation where obj
is not a string,
or it is a string but has the wrong form.
In this case, one of the pred
(lines 3-5) fails to match,
thus and
(line 2) fails to match,
thus or
(line 1) proceeds to try sub-pattern let
(line 8).
First, let
evaluates (list "149" 'default)
to get ("149" default)
, the exprval, and then
tries to match exprval against pattern val
.
Since that is a symbol pattern, it matches unconditionally
and additionally binds val
to exprval.
Now that let
has matched, or
matches.
Note how both and
and let
sub-patterns finish in the
same way: by trying (always successfully) to match against the
symbol pattern val
, in the process binding val
.
Thus, or
always matches and control always passes
to the body form (line 9).
Because that is the last body form in a successfully matched
pcase
clause, it is the value of pcase
and likewise
the return value of grok/pcase
(see What Is a Function?).
Caveats for symbol in Sequencing Patterns
The preceding examples all use sequencing patterns
which include the symbol
sub-pattern in some way.
Here are some important details about that usage.
- When symbol occurs more than once in seqpat,
the second and subsequent occurrences do not expand to re-binding,
but instead expand to an equality test using
eq
.
The following example features a pcase
form
with two clauses and two seqpat, A and B.
Both A and B first check that expval is a
pair (using pred
),
and then bind symbols to the car
and cdr
of expval (using one app
each).
For A, because symbol st
is mentioned twice, the second
mention becomes an equality test using eq
.
On the other hand, B uses two separate symbols, s1
and
s2
, both of which become independent bindings.
(defun grok (object)
(pcase object
((and (pred consp) ; seqpat A
(app car st) ; first mention: st
(app cdr st)) ; second mention: st
(list 'eq st))
((and (pred consp) ; seqpat B
(app car s1) ; first mention: s1
(app cdr s2)) ; first mention: s2
(list 'not-eq s1 s2))))
(let ((s "yow!"))
(grok (cons s s))) ⇒ (eq "yow!")
(grok (cons "yo!" "yo!")) ⇒ (not-eq "yo!" "yo!")
(grok '(4 2)) ⇒ (not-eq 4 (2))
- Side-effecting code referencing symbol is undefined.
Avoid.
For example, here are two similar functions.
Both use
and
, symbol and guard
:
(defun square-double-digit-p/CLEAN (integer)
(pcase (* integer integer)
((and n (guard (< 9 n 100))) (list 'yes n))
(sorry (list 'no sorry))))
(square-double-digit-p/CLEAN 9) ⇒ (yes 81)
(square-double-digit-p/CLEAN 3) ⇒ (no 9)
(defun square-double-digit-p/MAYBE (integer)
(pcase (* integer integer)
((and n (guard (< 9 (incf n) 100))) (list 'yes n))
(sorry (list 'no sorry))))
(square-double-digit-p/MAYBE 9) ⇒ (yes 81)
(square-double-digit-p/MAYBE 3) ⇒ (yes 9) ; WRONG!
The difference is in boolean-expression in guard
:
CLEAN
references n
simply and directly,
while MAYBE
references n
with a side-effect,
in the expression (incf n)
.
When integer
is 3, here’s what happens:
- The first
n
binds it to expval,
i.e., the result of evaluating (* 3 3)
, or 9.
- boolean-expression is evaluated:
start: (< 9 (incf n) 100)
becomes: (< 9 (setq n (1+ n)) 100)
becomes: (< 9 (setq n (1+ 9)) 100)
becomes: (< 9 (setq n 10) 100)
; side-effect here!
becomes: (< 9 n 100) ; n
now bound to 10
becomes: (< 9 10 100)
becomes: t
- Because the result of the evaluation is non-
nil
,
guard
matches, and
matches, and
control passes to that clause’s body forms.
Aside from the mathematical incorrectness of asserting that 9 is a
double-digit integer, there is another problem with MAYBE
.
The body form references n
once more, yet we do not see
the updated value—10—at all. What happened to it?
To sum up, it’s best to avoid side-effecting references to
symbol patterns entirely, not only
in boolean-expression (in guard
),
but also in expr (in let
)
and function (in pred
and app
).
- On match, the clause’s body forms can reference the set
of symbols the pattern let-binds.
When seqpat is
and
, this set is
the union of all the symbols each of its sub-patterns let-binds.
This makes sense because, for and
to match,
all the sub-patterns must match.
When seqpat is or
, things are different:
or
matches at the first sub-pattern that matches;
the rest of the sub-patterns are ignored.
It makes no sense for each sub-pattern to let-bind a different
set of symbols because the body forms have no way to distinguish
which sub-pattern matched and choose among the different sets.
For example, the following is invalid:
(require 'cl-lib)
(pcase (read-number "Enter an integer: ")
((or (and (pred cl-evenp)
e-num) ; bind e-num
to expval
o-num) ; bind o-num
to expval
(list e-num o-num)))
Enter an integer: 42
error→ Symbol’s value as variable is void: o-num
Enter an integer: 149
error→ Symbol’s value as variable is void: e-num
Evaluating body form (list e-num o-num)
signals error.
To distinguish between sub-patterns, you can use another symbol,
identical in name in all sub-patterns but differing in value.
Reworking the above example:
(require 'cl-lib)
(pcase (read-number "Enter an integer: ")
((and num ; line 1
(or (and (pred cl-evenp) ; line 2
(let spin 'even)) ; line 3
(let spin 'odd))) ; line 4
(list spin num))) ; line 5
Enter an integer: 42
⇒ (even 42)
Enter an integer: 149
⇒ (odd 149)
Line 1 “factors out” the expval binding with
and
and symbol (in this case, num
).
On line 2, or
begins in the same way as before,
but instead of binding different symbols, uses let
twice
(lines 3-4) to bind the same symbol spin
in both sub-patterns.
The value of spin
distinguishes the sub-patterns.
The body form references both symbols (line 5).
11.4.2 Extending pcase
The pcase
macro supports several kinds of patterns
(see Pattern-Matching Conditional).
You can add support for other kinds of patterns
using the pcase-defmacro
macro.
- Macro: pcase-defmacro name args [doc] &rest body ¶
Define a new kind of pattern for pcase
, to be invoked
as (name actual-args)
.
The pcase
macro expands this into a function call
that evaluates body, whose job it is to
rewrite the invoked pattern into some other pattern,
in an environment where args are bound to actual-args.
Additionally, arrange to display doc along with
the docstring of pcase
.
By convention, doc should use EXPVAL
to stand for the result of
evaluating expression (first arg to pcase
).
Typically, body rewrites the invoked pattern
to use more basic patterns.
Although all patterns eventually reduce to core patterns,
body
need not use core patterns straight away.
The following example defines two patterns, named
less-than
and integer-less-than
.
(pcase-defmacro less-than (n)
"Matches if EXPVAL is a number less than N."
`(pred (> ,n)))
(pcase-defmacro integer-less-than (n)
"Matches if EXPVAL is an integer less than N."
`(and (pred integerp)
(less-than ,n)))
Note that the docstrings mention args
(in this case, only one: n
) in the usual way,
and also mention EXPVAL
by convention.
The first rewrite (i.e., body for less-than
)
uses one core pattern: pred
.
The second uses two core patterns: and
and pred
,
as well as the newly-defined pattern less-than
.
Both use a single backquote construct (see Backquote).
11.4.3 Backquote-Style Patterns
This subsection describes backquote-style patterns,
a set of builtin patterns that eases structural matching.
For background, see Pattern-Matching Conditional.
Backquote-style patterns are a powerful set of pcase
pattern
extensions (created using pcase-defmacro
) that make it easy to
match expval against specifications of its structure.
For example, to match expval that must be a list of two
elements whose first element is a specific string and the second
element is any value, you can write a core pattern:
(and (pred listp)
ls
(guard (= 2 (length ls)))
(guard (string= "first" (car ls)))
(let second-elem (cadr ls)))
or you can write the equivalent backquote-style pattern:
The backquote-style pattern is more concise,
resembles the structure of expval,
and avoids binding ls
.
A backquote-style pattern has the form `qpat
where
qpat can have the following forms:
(qpat1 . qpat2)
Matches if expval is a cons cell whose car
matches qpat1 and whose cdr
matches qpat2.
This readily generalizes to lists as in
(qpat1 qpat2 …)
.
[qpat1 qpat2 … qpatm]
Matches if expval is a vector of length m whose
0
..(m-1)
th elements match qpat1,
qpat2 … qpatm, respectively.
symbol
keyword
number
string
Matches if the corresponding element of expval is
equal
to the specified literal object.
,pattern
Matches if the corresponding element of expval
matches pattern.
Note that pattern is any kind that pcase
supports.
(In the example above, second-elem
is a symbol
core pattern; it therefore matches anything,
and let-binds second-elem
.)
The corresponding element is the portion of expval
that is in the same structural position as the structural position
of qpat in the backquote-style pattern.
(In the example above, the corresponding element of
second-elem
is the second element of expval.)
Here is an example of using pcase
to implement a simple
interpreter for a little expression language
(note that this requires lexical binding for the
lambda expression in the fn
clause to properly
capture body
and arg
(see Lexical Binding):
(defun evaluate (form env)
(pcase form
(`(add ,x ,y) (+ (evaluate x env)
(evaluate y env)))
(`(call ,fun ,arg) (funcall (evaluate fun env)
(evaluate arg env)))
(`(fn ,arg ,body) (lambda (val)
(evaluate body (cons (cons arg val)
env))))
((pred numberp) form)
((pred symbolp) (cdr (assq form env)))
(_ (error "Syntax error: %S" form))))
The first three clauses use backquote-style patterns.
`(add ,x ,y)
is a pattern that checks that form
is a three-element list starting with the literal symbol add
,
then extracts the second and third elements and binds them
to symbols x
and y
, respectively. This is known as
destructuring, see Destructuring with pcase
Patterns.
The clause body evaluates x
and y
and adds the results.
Similarly, the call
clause implements a function call,
and the fn
clause implements an anonymous function definition.
The remaining clauses use core patterns.
(pred numberp)
matches if form
is a number.
On match, the body evaluates it.
(pred symbolp)
matches if form
is a symbol.
On match, the body looks up the symbol in env
and
returns its association.
Finally, _
is the catch-all pattern that
matches anything, so it’s suitable for reporting syntax errors.
Here are some sample programs in this small language, including their
evaluation results:
(evaluate '(add 1 2) nil) ⇒ 3
(evaluate '(add x y) '((x . 1) (y . 2))) ⇒ 3
(evaluate '(call (fn x (add 1 x)) 2) nil) ⇒ 3
(evaluate '(sub 1 2) nil) ⇒ error
11.4.4 Destructuring with pcase
Patterns
Pcase patterns not only express a condition on the form of the objects
they can match, but they can also extract sub-fields of those objects.
For example we can extract 2 elements from a list that is the value of
the variable my-list
with the following code:
(pcase my-list
(`(add ,x ,y) (message "Contains %S and %S" x y)))
This will not only extract x
and y
but will additionally
test that my-list
is a list containing exactly 3 elements and
whose first element is the symbol add
. If any of those tests
fail, pcase
will immediately return nil
without calling
message
.
Extraction of multiple values stored in an object is known as
destructuring. Using pcase
patterns allows to perform
destructuring binding, which is similar to a local binding
(see Local Variables), but gives values to multiple elements of
a variable by extracting those values from an object of compatible
structure.
The macros described in this section use pcase
patterns to
perform destructuring binding. The condition of the object to be of
compatible structure means that the object must match the pattern,
because only then the object’s subfields can be extracted. For
example:
(pcase-let ((`(add ,x ,y) my-list))
(message "Contains %S and %S" x y))
does the same as the previous example, except that it directly tries
to extract x
and y
from my-list
without first
verifying if my-list
is a list which has the right number of
elements and has add
as its first element. The precise
behavior when the object does not actually match the pattern is
undefined, although the body will not be silently skipped: either an
error is signaled or the body is run with some of the variables
potentially bound to arbitrary values like nil
.
The pcase patterns that are useful for destructuring bindings are
generally those described in Backquote-Style Patterns, since they
express a specification of the structure of objects that will match.
For an alternative facility for destructuring binding, see
seq-let.
- Macro: pcase-let bindings body… ¶
Perform destructuring binding of variables according to
bindings, and then evaluate body.
bindings is a list of bindings of the form (pattern exp)
, where exp is an expression to evaluate and
pattern is a pcase
pattern.
All exps are evaluated first, after which they are matched
against their respective pattern, introducing new variable
bindings that can then be used inside body. The variable
bindings are produced by destructuring binding of elements of
pattern to the values of the corresponding elements of the
evaluated exp.
Here’s a trivial example:
(pcase-let ((`(,major ,minor)
(split-string "image/png" "/")))
minor)
⇒ "png"
- Macro: pcase-let* bindings body… ¶
Perform destructuring binding of variables according to
bindings, and then evaluate body.
bindings is a list of bindings of the form (pattern
exp)
, where exp is an expression to evaluate and
pattern is a pcase
pattern. The variable bindings are
produced by destructuring binding of elements of pattern to the
values of the corresponding elements of the evaluated exp.
Unlike pcase-let
, but similarly to let*
, each exp
is matched against its corresponding pattern before processing
the next element of bindings, so the variable bindings
introduced in each one of the bindings are available in the
exps of the bindings that follow it, additionally to
being available in body.
- Macro: pcase-dolist (pattern list) body… ¶
Execute body once for each element of list, on each
iteration performing a destructuring binding of variables in
pattern to the values of the corresponding subfields of the
element of list. The bindings are performed as if by
pcase-let
. When pattern is a simple variable, this ends
up being equivalent to dolist
(see Iteration).
- Macro: pcase-setq pattern value… ¶
Assign values to variables in a setq
form, destructuring each
value according to its respective pattern.
- Macro: pcase-lambda lambda-list &rest body ¶
This is like lambda
, but allows each argument to be a pattern.
For instance, here’s a simple function that takes a cons cell as the
argument:
(setq fun
(pcase-lambda (`(,key . ,val))
(vector key (* val 10))))
(funcall fun '(foo . 2))
⇒ [foo 20]
11.5 Iteration
Iteration means executing part of a program repetitively. For
example, you might want to repeat some computation once for each element
of a list, or once for each integer from 0 to n. You can do this
in Emacs Lisp with the special form while
:
- Special Form: while condition forms… ¶
while
first evaluates condition. If the result is
non-nil
, it evaluates forms in textual order. Then it
reevaluates condition, and if the result is non-nil
, it
evaluates forms again. This process repeats until condition
evaluates to nil
.
There is no limit on the number of iterations that may occur. The loop
will continue until either condition evaluates to nil
or
until an error or throw
jumps out of it (see Nonlocal Exits).
The value of a while
form is always nil
.
(setq num 0)
⇒ 0
(while (< num 4)
(princ (format "Iteration %d." num))
(setq num (1+ num)))
-| Iteration 0.
-| Iteration 1.
-| Iteration 2.
-| Iteration 3.
⇒ nil
To write a repeat-until loop, which will execute something on each
iteration and then do the end-test, put the body followed by the
end-test in a progn
as the first argument of while
, as
shown here:
(while (progn
(forward-line 1)
(not (looking-at "^$"))))
This moves forward one line and continues moving by lines until it
reaches an empty line. It is peculiar in that the while
has no
body, just the end test (which also does the real work of moving point).
The dolist
and dotimes
macros provide convenient ways to
write two common kinds of loops.
- Macro: dolist (var list [result]) body… ¶
This construct executes body once for each element of
list, binding the variable var locally to hold the current
element. Then it returns the value of evaluating result, or
nil
if result is omitted. For example, here is how you
could use dolist
to define the reverse
function:
(defun reverse (list)
(let (value)
(dolist (elt list value)
(setq value (cons elt value)))))
- Macro: dotimes (var count [result]) body… ¶
This construct executes body once for each integer from 0
(inclusive) to count (exclusive), binding the variable var
to the integer for the current iteration. Then it returns the value
of evaluating result, or nil
if result is omitted.
Use of result is deprecated. Here is an example of using
dotimes
to do something 100 times:
(dotimes (i 100)
(insert "I will not obey absurd orders\n"))
11.6 Generators
A generator is a function that produces a potentially-infinite
stream of values. Each time the function produces a value, it
suspends itself and waits for a caller to request the next value.
- Macro: iter-defun name args [doc] [declare] [interactive] body… ¶
iter-defun
defines a generator function. A generator function
has the same signature as a normal function, but works differently.
Instead of executing body when called, a generator function
returns an iterator object. That iterator runs body to generate
values, emitting a value and pausing where iter-yield
or
iter-yield-from
appears. When body returns normally,
iter-next
signals iter-end-of-sequence
with body’s
result as its condition data.
Any kind of Lisp code is valid inside body, but
iter-yield
and iter-yield-from
cannot appear inside
unwind-protect
forms.
- Macro: iter-lambda args [doc] [interactive] body… ¶
iter-lambda
produces an unnamed generator function that works
just like a generator function produced with iter-defun
.
- Macro: iter-yield value ¶
When it appears inside a generator function, iter-yield
indicates that the current iterator should pause and return
value from iter-next
. iter-yield
evaluates to the
value
parameter of next call to iter-next
.
- Macro: iter-yield-from iterator ¶
iter-yield-from
yields all the values that iterator
produces and evaluates to the value that iterator’s generator
function returns normally. While it has control, iterator
receives values sent to the iterator using iter-next
.
To use a generator function, first call it normally, producing a
iterator object. An iterator is a specific instance of a
generator. Then use iter-next
to retrieve values from this
iterator. When there are no more values to pull from an iterator,
iter-next
raises an iter-end-of-sequence
condition with
the iterator’s final value.
It’s important to note that generator function bodies only execute
inside calls to iter-next
. A call to a function defined with
iter-defun
produces an iterator; you must drive this
iterator with iter-next
for anything interesting to happen.
Each call to a generator function produces a different
iterator, each with its own state.
- Function: iter-next iterator &optional value ¶
Retrieve the next value from iterator. If there are no more
values to be generated (because iterator’s generator function
returned), iter-next
signals the iter-end-of-sequence
condition; the data value associated with this condition is the value
with which iterator’s generator function returned.
value is sent into the iterator and becomes the value to which
iter-yield
evaluates. value is ignored for the first
iter-next
call to a given iterator, since at the start of
iterator’s generator function, the generator function is not
evaluating any iter-yield
form.
- Function: iter-close iterator ¶
If iterator is suspended inside an unwind-protect
’s
bodyform
and becomes unreachable, Emacs will eventually run
unwind handlers after a garbage collection pass. (Note that
iter-yield
is illegal inside an unwind-protect
’s
unwindforms
.) To ensure that these handlers are run before
then, use iter-close
.
Some convenience functions are provided to make working with
iterators easier:
- Macro: iter-do (var iterator) body … ¶
Run body with var bound to each value that
iterator produces.
The Common Lisp loop facility also contains features for working with
iterators. See Loop Facility in Common Lisp Extensions.
The following piece of code demonstrates some important principles of
working with iterators.
(require 'generator)
(iter-defun my-iter (x)
(iter-yield (1+ (iter-yield (1+ x))))
;; Return normally
-1)
(let* ((iter (my-iter 5))
(iter2 (my-iter 0)))
;; Prints 6
(print (iter-next iter))
;; Prints 9
(print (iter-next iter 8))
;; Prints 1; iter and iter2 have distinct states
(print (iter-next iter2 nil))
;; We expect the iter sequence to end now
(condition-case x
(iter-next iter)
(iter-end-of-sequence
;; Prints -1, which my-iter returned normally
(print (cdr x)))))
11.7 Nonlocal Exits
A nonlocal exit is a transfer of control from one point in a
program to another remote point. Nonlocal exits can occur in Emacs Lisp
as a result of errors; you can also use them under explicit control.
Nonlocal exits unbind all variable bindings made by the constructs being
exited.
11.7.1 Explicit Nonlocal Exits: catch
and throw
Most control constructs affect only the flow of control within the
construct itself. The function throw
is the exception to this
rule of normal program execution: it performs a nonlocal exit on
request. (There are other exceptions, but they are for error handling
only.) throw
is used inside a catch
, and jumps back to
that catch
. For example:
(defun foo-outer ()
(catch 'foo
(foo-inner)))
(defun foo-inner ()
…
(if x
(throw 'foo t))
…)
The throw
form, if executed, transfers control straight back to
the corresponding catch
, which returns immediately. The code
following the throw
is not executed. The second argument of
throw
is used as the return value of the catch
.
The function throw
finds the matching catch
based on the
first argument: it searches for a catch
whose first argument is
eq
to the one specified in the throw
. If there is more
than one applicable catch
, the innermost one takes precedence.
Thus, in the above example, the throw
specifies foo
, and
the catch
in foo-outer
specifies the same symbol, so that
catch
is the applicable one (assuming there is no other matching
catch
in between).
Executing throw
exits all Lisp constructs up to the matching
catch
, including function calls. When binding constructs such
as let
or function calls are exited in this way, the bindings
are unbound, just as they are when these constructs exit normally
(see Local Variables). Likewise, throw
restores the buffer
and position saved by save-excursion
(see Excursions), and
the narrowing status saved by save-restriction
. It also runs
any cleanups established with the unwind-protect
special form
when it exits that form (see Cleaning Up from Nonlocal Exits).
The throw
need not appear lexically within the catch
that it jumps to. It can equally well be called from another function
called within the catch
. As long as the throw
takes place
chronologically after entry to the catch
, and chronologically
before exit from it, it has access to that catch
. This is why
throw
can be used in commands such as exit-recursive-edit
that throw back to the editor command loop (see Recursive Editing).
Common Lisp note: Most other versions of Lisp, including Common Lisp,
have several ways of transferring control nonsequentially: return
,
return-from
, and go
, for example. Emacs Lisp has only
throw
. The cl-lib library provides versions of some of
these. See Blocks and Exits in Common Lisp Extensions.
- Special Form: catch tag body… ¶
-
catch
establishes a return point for the throw
function.
The return point is distinguished from other such return points by
tag, which may be any Lisp object except nil
. The argument
tag is evaluated normally before the return point is established.
With the return point in effect, catch
evaluates the forms of the
body in textual order. If the forms execute normally (without
error or nonlocal exit) the value of the last body form is returned from
the catch
.
If a throw
is executed during the execution of body,
specifying the same value tag, the catch
form exits
immediately; the value it returns is whatever was specified as the
second argument of throw
.
- Function: throw tag value ¶
The purpose of throw
is to return from a return point previously
established with catch
. The argument tag is used to choose
among the various existing return points; it must be eq
to the value
specified in the catch
. If multiple return points match tag,
the innermost one is used.
The argument value is used as the value to return from that
catch
.
If no return point is in effect with tag tag, then a no-catch
error is signaled with data (tag value)
.
11.7.2 Examples of catch
and throw
One way to use catch
and throw
is to exit from a doubly
nested loop. (In most languages, this would be done with a goto
.)
Here we compute (foo i j)
for i and j
varying from 0 to 9:
(defun search-foo ()
(catch 'loop
(let ((i 0))
(while (< i 10)
(let ((j 0))
(while (< j 10)
(if (foo i j)
(throw 'loop (list i j)))
(setq j (1+ j))))
(setq i (1+ i))))))
If foo
ever returns non-nil
, we stop immediately and return a
list of i and j. If foo
always returns nil
, the
catch
returns normally, and the value is nil
, since that
is the result of the while
.
Here are two tricky examples, slightly different, showing two
return points at once. First, two return points with the same tag,
hack
:
(defun catch2 (tag)
(catch tag
(throw 'hack 'yes)))
⇒ catch2
(catch 'hack
(print (catch2 'hack))
'no)
-| yes
⇒ no
Since both return points have tags that match the throw
, it goes to
the inner one, the one established in catch2
. Therefore,
catch2
returns normally with value yes
, and this value is
printed. Finally the second body form in the outer catch
, which is
'no
, is evaluated and returned from the outer catch
.
Now let’s change the argument given to catch2
:
(catch 'hack
(print (catch2 'quux))
'no)
⇒ yes
We still have two return points, but this time only the outer one has
the tag hack
; the inner one has the tag quux
instead.
Therefore, throw
makes the outer catch
return the value
yes
. The function print
is never called, and the
body-form 'no
is never evaluated.
11.7.3 Errors
When Emacs Lisp attempts to evaluate a form that, for some reason,
cannot be evaluated, it signals an error.
When an error is signaled, Emacs’s default reaction is to print an
error message and terminate execution of the current command. This is
the right thing to do in most cases, such as if you type C-f at
the end of the buffer.
In complicated programs, simple termination may not be what you want.
For example, the program may have made temporary changes in data
structures, or created temporary buffers that should be deleted before
the program is finished. In such cases, you would use
unwind-protect
to establish cleanup expressions to be
evaluated in case of error. (See Cleaning Up from Nonlocal Exits.) Occasionally, you may
wish the program to continue execution despite an error in a subroutine.
In these cases, you would use condition-case
to establish
error handlers to recover control in case of error.
For reporting problems without terminating the execution of the
current command, consider issuing a warning instead. See Reporting Warnings.
Resist the temptation to use error handling to transfer control from
one part of the program to another; use catch
and throw
instead. See Explicit Nonlocal Exits: catch
and throw
.
11.7.3.1 How to Signal an Error
Signaling an error means beginning error processing. Error
processing normally aborts all or part of the running program and
returns to a point that is set up to handle the error
(see How Emacs Processes Errors). Here we describe how to signal an
error.
Most errors are signaled automatically within Lisp primitives
which you call for other purposes, such as if you try to take the
CAR of an integer or move forward a character at the end of the
buffer. You can also signal errors explicitly with the functions
error
and signal
.
Quitting, which happens when the user types C-g, is not
considered an error, but it is handled almost like an error.
See Quitting.
Every error specifies an error message, one way or another. The
message should state what is wrong (“File does not exist”), not how
things ought to be (“File must exist”). The convention in Emacs
Lisp is that error messages should start with a capital letter, but
should not end with any sort of punctuation.
- Function: error format-string &rest args ¶
This function signals an error with an error message constructed by
applying format-message
(see Formatting Strings) to
format-string and args.
These examples show typical uses of error
:
(error "That is an error -- try something else")
error→ That is an error -- try something else
(error "Invalid name `%s'" "A%%B")
error→ Invalid name ‘A%%B’
error
works by calling signal
with two arguments: the
error symbol error
, and a list containing the string returned by
format-message
.
Typically grave accent and apostrophe in the format translate to
matching curved quotes, e.g., "Missing `%s'" might result in
"Missing ‘foo’". See Text Quoting Style, for how to influence
or inhibit this translation.
Warning: If you want to use your own string as an error message
verbatim, don’t just write (error string)
. If string
string contains ‘%’, ‘`’, or ‘'’ it may be
reformatted, with undesirable results. Instead, use (error "%s"
string)
.
When noninteractive
is non-nil
(see Batch Mode),
this function kills Emacs if the signaled error has no handler.
- Function: signal error-symbol data ¶
This function signals an error named by error-symbol. The
argument data is a list of additional Lisp objects relevant to
the circumstances of the error.
The argument error-symbol must be an error symbol—a symbol
defined with define-error
. This is how Emacs Lisp classifies different
sorts of errors. See Error Symbols and Condition Names, for a description of error symbols,
error conditions and condition names.
If the error is not handled, the two arguments are used in printing
the error message. Normally, this error message is provided by the
error-message
property of error-symbol. If data is
non-nil
, this is followed by a colon and a comma separated list
of the unevaluated elements of data. For error
, the
error message is the CAR of data (that must be a string).
Subcategories of file-error
are handled specially.
The number and significance of the objects in data depends on
error-symbol. For example, with a wrong-type-argument
error,
there should be two objects in the list: a predicate that describes the type
that was expected, and the object that failed to fit that type.
Both error-symbol and data are available to any error
handlers that handle the error: condition-case
binds a local
variable to a list of the form (error-symbol .
data)
(see Writing Code to Handle Errors).
The function signal
never returns.
If the error error-symbol has no handler, and
noninteractive
is non-nil
(see Batch Mode),
this function eventually kills Emacs.
(signal 'wrong-number-of-arguments '(x y))
error→ Wrong number of arguments: x, y
(signal 'no-such-error '("My unknown error condition"))
error→ peculiar error: "My unknown error condition"
- Function: user-error format-string &rest args ¶
This function behaves exactly like error
, except that it uses
the error symbol user-error
rather than error
. As the
name suggests, this is intended to report errors on the part of the
user, rather than errors in the code itself. For example,
if you try to use the command Info-history-back
(l) to
move back beyond the start of your Info browsing history, Emacs
signals a user-error
. Such errors do not cause entry to the
debugger, even when debug-on-error
is non-nil
.
See Entering the Debugger on an Error.
Common Lisp note: Emacs Lisp has nothing like the Common Lisp
concept of continuable errors.
11.7.3.2 How Emacs Processes Errors
When an error is signaled, signal
searches for an active
handler for the error. A handler is a sequence of Lisp
expressions designated to be executed if an error happens in part of the
Lisp program. If the error has an applicable handler, the handler is
executed, and control resumes following the handler. The handler
executes in the environment of the condition-case
that
established it; all functions called within that condition-case
have already been exited, and the handler cannot return to them.
If there is no applicable handler for the error, it terminates the
current command and returns control to the editor command loop. (The
command loop has an implicit handler for all kinds of errors.) The
command loop’s handler uses the error symbol and associated data to
print an error message. You can use the variable
command-error-function
to control how this is done:
- Variable: command-error-function ¶
This variable, if non-nil
, specifies a function to use to
handle errors that return control to the Emacs command loop. The
function should take three arguments: data, a list of the same
form that condition-case
would bind to its variable;
context, a string describing the situation in which the error
occurred, or (more often) nil
; and caller, the Lisp
function which called the primitive that signaled the error.
An error that has no explicit handler may call the Lisp debugger
(see Invoking the Debugger). The debugger is enabled if the
variable debug-on-error
(see Entering the Debugger on an Error) is
non-nil
. Unlike error handlers, the debugger runs in the
environment of the error, so that you can examine values of variables
precisely as they were at the time of the error. In batch mode
(see Batch Mode), the Emacs process then normally exits with a
non-zero exit status.
11.7.3.3 Writing Code to Handle Errors
The usual effect of signaling an error is to terminate the command
that is running and return immediately to the Emacs editor command loop.
You can arrange to trap errors occurring in a part of your program by
establishing an error handler, with the special form
condition-case
. A simple example looks like this:
(condition-case nil
(delete-file filename)
(error nil))
This deletes the file named filename, catching any error and
returning nil
if an error occurs. (You can use the macro
ignore-errors
for a simple case like this; see below.)
The condition-case
construct is often used to trap errors that
are predictable, such as failure to open a file in a call to
insert-file-contents
. It is also used to trap errors that are
totally unpredictable, such as when the program evaluates an expression
read from the user.
The second argument of condition-case
is called the
protected form. (In the example above, the protected form is a
call to delete-file
.) The error handlers go into effect when
this form begins execution and are deactivated when this form returns.
They remain in effect for all the intervening time. In particular, they
are in effect during the execution of functions called by this form, in
their subroutines, and so on. This is a good thing, since, strictly
speaking, errors can be signaled only by Lisp primitives (including
signal
and error
) called by the protected form, not by the
protected form itself.
The arguments after the protected form are handlers. Each handler
lists one or more condition names (which are symbols) to specify
which errors it will handle. The error symbol specified when an error
is signaled also defines a list of condition names. A handler applies
to an error if they have any condition names in common. In the example
above, there is one handler, and it specifies one condition name,
error
, which covers all errors.
The search for an applicable handler checks all the established handlers
starting with the most recently established one. Thus, if two nested
condition-case
forms offer to handle the same error, the inner of
the two gets to handle it.
If an error is handled by some condition-case
form, this
ordinarily prevents the debugger from being run, even if
debug-on-error
says this error should invoke the debugger.
If you want to be able to debug errors that are caught by a
condition-case
, set the variable debug-on-signal
to a
non-nil
value. You can also specify that a particular handler
should let the debugger run first, by writing debug
among the
conditions, like this:
(condition-case nil
(delete-file filename)
((debug error) nil))
The effect of debug
here is only to prevent
condition-case
from suppressing the call to the debugger. Any
given error will invoke the debugger only if debug-on-error
and
the other usual filtering mechanisms say it should. See Entering the Debugger on an Error.
- Macro: condition-case-unless-debug var protected-form handlers… ¶
The macro condition-case-unless-debug
provides another way to
handle debugging of such forms. It behaves exactly like
condition-case
, unless the variable debug-on-error
is
non-nil
, in which case it does not handle any errors at all.
Once Emacs decides that a certain handler handles the error, it
returns control to that handler. To do so, Emacs unbinds all variable
bindings made by binding constructs that are being exited, and
executes the cleanups of all unwind-protect
forms that are
being exited. Once control arrives at the handler, the body of the
handler executes normally.
After execution of the handler body, execution returns from the
condition-case
form. Because the protected form is exited
completely before execution of the handler, the handler cannot resume
execution at the point of the error, nor can it examine variable
bindings that were made within the protected form. All it can do is
clean up and proceed.
Error signaling and handling have some resemblance to throw
and
catch
(see Explicit Nonlocal Exits: catch
and throw
), but they are entirely separate
facilities. An error cannot be caught by a catch
, and a
throw
cannot be handled by an error handler (though using
throw
when there is no suitable catch
signals an error
that can be handled).
- Special Form: condition-case var protected-form handlers… ¶
This special form establishes the error handlers handlers around
the execution of protected-form. If protected-form executes
without error, the value it returns becomes the value of the
condition-case
form (in the absence of a success handler; see below).
In this case, the condition-case
has
no effect. The condition-case
form makes a difference when an
error occurs during protected-form.
Each of the handlers is a list of the form (conditions
body…)
. Here conditions is an error condition name
to be handled, or a list of condition names (which can include debug
to allow the debugger to run before the handler). A condition name of
t
matches any condition. body is one or more Lisp
expressions to be executed when this handler handles an error. Here
are examples of handlers:
(error nil)
(arith-error (message "Division by zero"))
((arith-error file-error)
(message
"Either division by zero or failure to open a file"))
Each error that occurs has an error symbol that describes what
kind of error it is, and which describes also a list of condition names
(see Error Symbols and Condition Names). Emacs
searches all the active condition-case
forms for a handler that
specifies one or more of these condition names; the innermost matching
condition-case
handles the error. Within this
condition-case
, the first applicable handler handles the error.
After executing the body of the handler, the condition-case
returns normally, using the value of the last form in the handler body
as the overall value.
The argument var is a variable. condition-case
does not
bind this variable when executing the protected-form, only when it
handles an error. At that time, it binds var locally to an
error description, which is a list giving the particulars of the
error. The error description has the form (error-symbol
. data)
. The handler can refer to this list to decide what to
do. For example, if the error is for failure opening a file, the file
name is the second element of data—the third element of the
error description.
If var is nil
, that means no variable is bound. Then the
error symbol and associated data are not available to the handler.
As a special case, one of the handlers can be a list of the
form (:success body…)
, where body is executed
with var (if non-nil
) bound to the return value of
protected-form when that expression terminates without error.
Sometimes it is necessary to re-throw a signal caught by
condition-case
, for some outer-level handler to catch. Here’s
how to do that:
(signal (car err) (cdr err))
where err
is the error description variable, the first argument
to condition-case
whose error condition you want to re-throw.
See Definition of signal.
- Function: error-message-string error-descriptor ¶
This function returns the error message string for a given error
descriptor. It is useful if you want to handle an error by printing the
usual error message for that error. See Definition of signal.
Here is an example of using condition-case
to handle the error
that results from dividing by zero. The handler displays the error
message (but without a beep), then returns a very large number.
(defun safe-divide (dividend divisor)
(condition-case err
;; Protected form.
(/ dividend divisor)
;; The handler.
(arith-error ; Condition.
;; Display the usual message for this error.
(message "%s" (error-message-string err))
1000000)))
⇒ safe-divide
(safe-divide 5 0)
-| Arithmetic error: (arith-error)
⇒ 1000000
The handler specifies condition name arith-error
so that it
will handle only division-by-zero errors. Other kinds of errors will
not be handled (by this condition-case
). Thus:
(safe-divide nil 3)
error→ Wrong type argument: number-or-marker-p, nil
Here is a condition-case
that catches all kinds of errors,
including those from error
:
(setq baz 34)
⇒ 34
(condition-case err
(if (eq baz 35)
t
;; This is a call to the function error
.
(error "Rats! The variable %s was %s, not 35" 'baz baz))
;; This is the handler; it is not a form.
(error (princ (format "The error was: %s" err))
2))
-| The error was: (error "Rats! The variable baz was 34, not 35")
⇒ 2
- Macro: ignore-errors body… ¶
This construct executes body, ignoring any errors that occur
during its execution. If the execution is without error,
ignore-errors
returns the value of the last form in body;
otherwise, it returns nil
.
Here’s the example at the beginning of this subsection rewritten using
ignore-errors
:
(ignore-errors
(delete-file filename))
- Macro: ignore-error condition body… ¶
This macro is like ignore-errors
, but will only ignore the
specific error condition specified.
(ignore-error end-of-file
(read ""))
condition can also be a list of error conditions.
- Macro: with-demoted-errors format body… ¶
This macro is like a milder version of ignore-errors
. Rather
than suppressing errors altogether, it converts them into messages.
It uses the string format to format the message.
format should contain a single ‘%’-sequence; e.g.,
"Error: %S"
. Use with-demoted-errors
around code
that is not expected to signal errors, but
should be robust if one does occur. Note that this macro uses
condition-case-unless-debug
rather than condition-case
.
11.7.3.4 Error Symbols and Condition Names
When you signal an error, you specify an error symbol to specify
the kind of error you have in mind. Each error has one and only one
error symbol to categorize it. This is the finest classification of
errors defined by the Emacs Lisp language.
These narrow classifications are grouped into a hierarchy of wider
classes called error conditions, identified by condition
names. The narrowest such classes belong to the error symbols
themselves: each error symbol is also a condition name. There are also
condition names for more extensive classes, up to the condition name
error
which takes in all kinds of errors (but not quit
).
Thus, each error has one or more condition names: error
, the
error symbol if that is distinct from error
, and perhaps some
intermediate classifications.
- Function: define-error name message &optional parent ¶
In order for a symbol to be an error symbol, it must be defined with
define-error
which takes a parent condition (defaults to error
).
This parent defines the conditions that this kind of error belongs to.
The transitive set of parents always includes the error symbol itself, and the
symbol error
. Because quitting is not considered an error, the set of
parents of quit
is just (quit)
.
In addition to its parents, the error symbol has a message which
is a string to be printed when that error is signaled but not handled. If that
message is not valid, the error message ‘peculiar error’ is used.
See Definition of signal.
Internally, the set of parents is stored in the error-conditions
property of the error symbol and the message is stored in the
error-message
property of the error symbol.
Here is how we define a new error symbol, new-error
:
(define-error 'new-error "A new error" 'my-own-errors)
This error has several condition names: new-error
, the narrowest
classification; my-own-errors
, which we imagine is a wider
classification; and all the conditions of my-own-errors
which should
include error
, which is the widest of all.
The error string should start with a capital letter but it should
not end with a period. This is for consistency with the rest of Emacs.
Naturally, Emacs will never signal new-error
on its own; only
an explicit call to signal
(see Definition of signal) in
your code can do this:
(signal 'new-error '(x y))
error→ A new error: x, y
This error can be handled through any of its condition names.
This example handles new-error
and any other errors in the class
my-own-errors
:
(condition-case foo
(bar nil t)
(my-own-errors nil))
The significant way that errors are classified is by their condition
names—the names used to match errors with handlers. An error symbol
serves only as a convenient way to specify the intended error message
and list of condition names. It would be cumbersome to give
signal
a list of condition names rather than one error symbol.
By contrast, using only error symbols without condition names would
seriously decrease the power of condition-case
. Condition names
make it possible to categorize errors at various levels of generality
when you write an error handler. Using error symbols alone would
eliminate all but the narrowest level of classification.
See Standard Errors, for a list of the main error symbols
and their conditions.
11.7.4 Cleaning Up from Nonlocal Exits
The unwind-protect
construct is essential whenever you
temporarily put a data structure in an inconsistent state; it permits
you to make the data consistent again in the event of an error or
throw. (Another more specific cleanup construct that is used only for
changes in buffer contents is the atomic change group; Atomic Change Groups.)
- Special Form: unwind-protect body-form cleanup-forms… ¶
-
unwind-protect
executes body-form with a guarantee that
the cleanup-forms will be evaluated if control leaves
body-form, no matter how that happens. body-form may
complete normally, or execute a throw
out of the
unwind-protect
, or cause an error; in all cases, the
cleanup-forms will be evaluated.
If body-form finishes normally, unwind-protect
returns the
value of body-form, after it evaluates the cleanup-forms.
If body-form does not finish, unwind-protect
does not
return any value in the normal sense.
Only body-form is protected by the unwind-protect
. If any
of the cleanup-forms themselves exits nonlocally (via a
throw
or an error), unwind-protect
is not
guaranteed to evaluate the rest of them. If the failure of one of the
cleanup-forms has the potential to cause trouble, then protect
it with another unwind-protect
around that form.
For example, here we make an invisible buffer for temporary use, and
make sure to kill it before finishing:
(let ((buffer (get-buffer-create " *temp*")))
(with-current-buffer buffer
(unwind-protect
body-form
(kill-buffer buffer))))
You might think that we could just as well write (kill-buffer
(current-buffer))
and dispense with the variable buffer
.
However, the way shown above is safer, if body-form happens to
get an error after switching to a different buffer! (Alternatively,
you could write a save-current-buffer
around body-form,
to ensure that the temporary buffer becomes current again in time to
kill it.)
Emacs includes a standard macro called with-temp-buffer
which
expands into more or less the code shown above (see Current Buffer). Several of the macros defined in
this manual use unwind-protect
in this way.
Here is an actual example derived from an FTP package. It creates a
process (see Processes) to try to establish a connection to a remote
machine. As the function ftp-login
is highly susceptible to
numerous problems that the writer of the function cannot anticipate, it
is protected with a form that guarantees deletion of the process in the
event of failure. Otherwise, Emacs might fill up with useless
subprocesses.
(let ((win nil))
(unwind-protect
(progn
(setq process (ftp-setup-buffer host file))
(if (setq win (ftp-login process host user password))
(message "Logged in")
(error "Ftp login failed")))
(or win (and process (delete-process process)))))
This example has a small bug: if the user types C-g to
quit, and the quit happens immediately after the function
ftp-setup-buffer
returns but before the variable process
is
set, the process will not be killed. There is no easy way to fix this bug,
but at least it is very unlikely.
12 Variables
A variable is a name used in a program to stand for a value.
In Lisp, each variable is represented by a Lisp symbol
(see Symbols). The variable name is simply the symbol’s name, and
the variable’s value is stored in the symbol’s value cell9. See Symbol Components. In Emacs Lisp, the use of a
symbol as a variable is independent of its use as a function name.
As previously noted in this manual, a Lisp program is represented
primarily by Lisp objects, and only secondarily as text. The textual
form of a Lisp program is given by the read syntax of the Lisp objects
that constitute the program. Hence, the textual form of a variable in
a Lisp program is written using the read syntax for the symbol
representing the variable.
12.1 Global Variables
The simplest way to use a variable is globally. This means that
the variable has just one value at a time, and this value is in effect
(at least for the moment) throughout the Lisp system. The value remains
in effect until you specify a new one. When a new value replaces the
old one, no trace of the old value remains in the variable.
You specify a value for a symbol with setq
. For example,
gives the variable x
the value (a b)
. Note that
setq
is a special form (see Special Forms); it does not
evaluate its first argument, the name of the variable, but it does
evaluate the second argument, the new value.
Once the variable has a value, you can refer to it by using the
symbol itself as an expression. Thus,
assuming the setq
form shown above has already been executed.
If you do set the same variable again, the new value replaces the old
one:
x
⇒ (a b)
(setq x 4)
⇒ 4
x
⇒ 4
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 Global 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.
12.3 Local Variables
Global variables have values that last until explicitly superseded
with new values. Sometimes it is useful to give a variable a
local value—a value that takes effect only within a certain
part of a Lisp program. When a variable has a local value, we say
that it is locally bound to that value, and that it is a
local variable.
For example, when a function is called, its argument variables
receive local values, which are the actual arguments supplied to the
function call; these local bindings take effect within the body of the
function. To take another example, the let
special form
explicitly establishes local bindings for specific variables, which
take effect only within the body of the let
form.
We also speak of the global binding, which is where
(conceptually) the global value is kept.
Establishing a local binding saves away the variable’s previous
value (or lack of one). We say that the previous value is
shadowed. Both global and local values may be shadowed. If a
local binding is in effect, using setq
on the local variable
stores the specified value in the local binding. When that local
binding is no longer in effect, the previously shadowed value (or lack
of one) comes back.
A variable can have more than one local binding at a time (e.g., if
there are nested let
forms that bind the variable). The
current binding is the local binding that is actually in effect.
It determines the value returned by evaluating the variable symbol,
and it is the binding acted on by setq
.
For most purposes, you can think of the current binding as the
innermost local binding, or the global binding if there is no local
binding. To be more precise, a rule called the scoping rule
determines where in a program a local binding takes effect. The
default scoping rule in Emacs Lisp is called dynamic scoping,
which simply states that the current binding at any given point in the
execution of a program is the most recently-created binding for that
variable that still exists. For details about dynamic scoping, and an
alternative scoping rule called lexical scoping, see Scoping Rules for Variable Bindings. Lately Emacs is moving towards using lexical binding in
more and more places, with the goal of eventually making lexical
binding the default. In particular, all Emacs Lisp source files and
the *scratch* buffer use lexical scoping.
The special forms let
and let*
exist to create local
bindings:
- Special Form: let (bindings…) forms… ¶
This special form sets up local bindings for a certain set of
variables, as specified by bindings, and then evaluates all of
the forms in textual order. Its return value is the value of
the last form in forms. The local bindings set up by let
will be in effect only within the body of forms.
Each of the bindings is either (i) a symbol, in which case
that symbol is locally bound to nil
; or (ii) a list of the
form (symbol value-form)
, in which case
symbol is locally bound to the result of evaluating
value-form. If value-form is omitted, nil
is used.
All of the value-forms in bindings are evaluated in the
order they appear and before binding any of the symbols to them.
Here is an example of this: z
is bound to the old value of
y
, which is 2, not the new value of y
, which is 1.
(setq y 2)
⇒ 2
(let ((y 1)
(z y))
(list y z))
⇒ (1 2)
On the other hand, the order of bindings is unspecified: in the
following example, either 1 or 2 might be printed.
(let ((x 1)
(x 2))
(print x))
Therefore, avoid binding a variable more than once in a single
let
form.
- Special Form: let* (bindings…) forms… ¶
This special form is like let
, but it binds each variable right
after computing its local value, before computing the local value for
the next variable. Therefore, an expression in bindings can
refer to the preceding symbols bound in this let*
form.
Compare the following example with the example above for let
.
(setq y 2)
⇒ 2
(let* ((y 1)
(z y)) ; Use the just-established value of y
.
(list y z))
⇒ (1 1)
Basically, the let*
binding of x
and y
in the
previous example is equivalent to using nested let
bindings:
(let ((y 1))
(let ((z y))
(list y z)))
- Special Form: letrec (bindings…) forms… ¶
This special form is like let*
, but all the variables are bound
before any of the local values are computed. The values are then
assigned to the locally bound variables. This is only useful when
lexical binding is in effect, and you want to create closures that
refer to bindings that would otherwise not yet be in effect when using
let*
.
For instance, here’s a closure that removes itself from a hook after
being run once:
(letrec ((hookfun (lambda ()
(message "Run once")
(remove-hook 'post-command-hook hookfun))))
(add-hook 'post-command-hook hookfun))
- Special Form: dlet (bindings…) forms… ¶
This special form is like let
, but it binds all variables
dynamically. This is rarely useful—you usually want to bind normal
variables lexically, and special variables (i.e., variables that are
defined with defvar
) dynamically, and this is what let
does.
dlet
can be useful when interfacing with old code that assumes
that certain variables are dynamically bound (see Dynamic Binding), but it’s impractical to defvar
these variables.
dlet
will temporarily make the bound variables special, execute
the forms, and then make the variables non-special again.
- Special Form: named-let name bindings &rest body ¶
This special form is a looping construct inspired from the
Scheme language. It is similar to let
: It binds the variables in
bindings, and then evaluates body. However,
named-let
also binds name to a
local function whose formal arguments are the variables in bindings
and whose body is body. This allows body to call itself
recursively by calling
name, where the arguments passed to name are used as the
new values of the bound variables in the recursive invocation.
Example of a loop summing a list of numbers:
(named-let sum ((numbers '(1 2 3 4))
(running-sum 0))
(if numbers
(sum (cdr numbers) (+ running-sum (car numbers)))
running-sum))
⇒ 10
Recursive calls to name that occur in tail
positions in body are guaranteed to be optimized as tail
calls, which means that they will not consume any additional stack
space no matter how deeply the recursion runs. Such recursive calls
will effectively jump to the top of the loop with new values for the
variables.
A function call is in the tail position if it’s the very last thing
done so that the value returned by the call is the value of body
itself, as is the case in the recursive call to sum
above.
Warning: named-let
works as expected only when
lexical-binding is enabled. See Lexical Binding.
Here is a complete list of the other facilities that create local
bindings:
Variables can also have buffer-local bindings (see Buffer-Local Variables); a few variables have terminal-local bindings
(see Multiple Terminals). These kinds of bindings work somewhat
like ordinary local bindings, but they are localized depending on
where you are in Emacs.
12.4 When a Variable is Void
We say that a variable is void if its symbol has an unassigned value
cell (see Symbol Components).
Under Emacs Lisp’s default dynamic scoping rule (see Scoping Rules for Variable Bindings), the value cell stores the variable’s current (local or
global) value. Note that an unassigned value cell is not the
same as having nil
in the value cell. The symbol nil
is
a Lisp object and can be the value of a variable, just as any other
object can be; but it is still a value. If a variable is void, trying
to evaluate the variable signals a void-variable
error, instead
of returning a value.
Under the optional lexical scoping rule, the value cell only holds
the variable’s global value—the value outside of any lexical binding
construct. When a variable is lexically bound, the local value is
determined by the lexical environment; hence, variables can have local
values even if their symbols’ value cells are unassigned.
- Function: makunbound symbol ¶
This function empties out the value cell of symbol, making the
variable void. It returns symbol.
If symbol has a dynamic local binding, makunbound
voids
the current binding, and this voidness lasts only as long as the local
binding is in effect. Afterwards, the previously shadowed local or
global binding is reexposed; then the variable will no longer be void,
unless the reexposed binding is void too.
Here are some examples (assuming dynamic binding is in effect):
(setq x 1) ; Put a value in the global binding.
⇒ 1
(let ((x 2)) ; Locally bind it.
(makunbound 'x) ; Void the local binding.
x)
error→ Symbol's value as variable is void: x
x ; The global binding is unchanged.
⇒ 1
(let ((x 2)) ; Locally bind it.
(let ((x 3)) ; And again.
(makunbound 'x) ; Void the innermost-local binding.
x)) ; And refer: it’s void.
error→ Symbol's value as variable is void: x
(let ((x 2))
(let ((x 3))
(makunbound 'x)) ; Void inner binding, then remove it.
x) ; Now outer let
binding is visible.
⇒ 2
- Function: boundp variable ¶
This function returns t
if variable (a symbol) is not
void, and nil
if it is void.
Here are some examples (assuming dynamic binding is in effect):
(boundp 'abracadabra) ; Starts out void.
⇒ nil
(let ((abracadabra 5)) ; Locally bind it.
(boundp 'abracadabra))
⇒ t
(boundp 'abracadabra) ; Still globally void.
⇒ nil
(setq abracadabra 5) ; Make it globally nonvoid.
⇒ 5
(boundp 'abracadabra)
⇒ t
12.5 Defining Global Variables
A variable definition is a construct that announces your
intention to use a symbol as a global variable. It uses the special
forms defvar
or defconst
, which are documented below.
A variable definition serves three purposes. First, it informs
people who read the code that the symbol is intended to be used
a certain way (as a variable). Second, it informs the Lisp system of
this, optionally supplying an initial value and a documentation
string. Third, it provides information to programming tools such as
etags
, allowing them to find where the variable was defined.
The difference between defconst
and defvar
is mainly a
matter of intent, serving to inform human readers of whether the value
should ever change. Emacs Lisp does not actually prevent you from
changing the value of a variable defined with defconst
. One
notable difference between the two forms is that defconst
unconditionally initializes the variable, whereas defvar
initializes it only if it is originally void.
To define a customizable variable, you should use defcustom
(which calls defvar
as a subroutine). See Defining Customization Variables.
- Special Form: defvar symbol [value [doc-string]] ¶
This special form defines symbol as a variable. Note that
symbol is not evaluated; the symbol to be defined should appear
explicitly in the defvar
form. The variable is marked as
special, meaning that it should always be dynamically bound
(see Scoping Rules for Variable Bindings).
If value is specified, and symbol is void (i.e., it has no
dynamically bound value; see When a Variable is Void), then value is
evaluated and symbol is set to the result. But if symbol
is not void, value is not evaluated, and symbol’s value is
left unchanged. If value is omitted, the value of symbol
is not changed in any case.
Note that specifying a value, even nil
, marks the variable as
special permanently. Whereas if value is omitted then the
variable is only marked special locally (i.e. within the current
lexical scope, or file if at the top-level). This can be useful for
suppressing byte compilation warnings, see Compiler Errors.
If symbol has a buffer-local binding in the current buffer,
defvar
acts on the default value, which is buffer-independent,
rather than the buffer-local binding. It sets the default value if
the default value is void. See Buffer-Local Variables.
If symbol is already let bound (e.g., if the defvar
form occurs in a let
form), then defvar
sets the toplevel
default value, like set-default-toplevel-value
.
The let binding remains in effect until its binding construct exits.
See Scoping Rules for Variable Bindings.
When you evaluate a top-level defvar
form with C-M-x
(eval-defun
) or with C-x C-e (eval-last-sexp
) in
Emacs Lisp mode, a special feature of these two commands arranges to
set the variable unconditionally, without testing whether its value is
void.
If the doc-string argument is supplied, it specifies the
documentation string for the variable (stored in the symbol’s
variable-documentation
property). See Documentation.
Here are some examples. This form defines foo
but does not
initialize it:
This example initializes the value of bar
to 23
, and gives
it a documentation string:
(defvar bar 23
"The normal weight of a bar.")
⇒ bar
The defvar
form returns symbol, but it is normally used
at top level in a file where its value does not matter.
For a more elaborate example of using defvar
without a value,
see Local defvar example.
- Special Form: defconst symbol value [doc-string] ¶
This special form defines symbol as a value and initializes it.
It informs a person reading your code that symbol has a standard
global value, established here, that should not be changed by the user
or by other programs. Note that symbol is not evaluated; the
symbol to be defined must appear explicitly in the defconst
.
The defconst
form, like defvar
, marks the variable as
special, meaning that it should always be dynamically bound
(see Scoping Rules for Variable Bindings). In addition, it marks the variable as
risky (see File Local Variables).
defconst
always evaluates value, and sets the value of
symbol to the result. If symbol does have a buffer-local
binding in the current buffer, defconst
sets the default value,
not the buffer-local value. (But you should not be making
buffer-local bindings for a symbol that is defined with
defconst
.)
An example of the use of defconst
is Emacs’s definition of
float-pi
—the mathematical constant pi, which ought not
to be changed by anyone (attempts by the Indiana State Legislature
notwithstanding). As the second form illustrates, however,
defconst
is only advisory.
(defconst float-pi 3.141592653589793 "The value of Pi.")
⇒ float-pi
(setq float-pi 3)
⇒ float-pi
float-pi
⇒ 3
Warning: If you use a defconst
or defvar
special form while the variable has a local binding (made with
let
, or a function argument), it sets the local binding rather
than the global binding. This is not what you usually want. To
prevent this, use these special forms at top level in a file, where
normally no local binding is in effect, and make sure to load the file
before making a local binding for the variable.
12.6 Tips for Defining Variables Robustly
When you define a variable whose value is a function, or a list of
functions, use a name that ends in ‘-function’ or
‘-functions’, respectively.
There are several other variable name conventions;
here is a complete list:
- ‘…-hook’
The variable is a normal hook (see Hooks).
- ‘…-function’
The value is a function.
- ‘…-functions’
The value is a list of functions.
- ‘…-form’
The value is a form (an expression).
- ‘…-forms’
The value is a list of forms (expressions).
- ‘…-predicate’
The value is a predicate—a function of one argument that returns
non-nil
for success and nil
for failure.
- ‘…-flag’
The value is significant only as to whether it is nil
or not.
Since such variables often end up acquiring more values over time,
this convention is not strongly recommended.
- ‘…-program’
The value is a program name.
- ‘…-command’
The value is a whole shell command.
- ‘…-switches’
The value specifies options for a command.
- ‘prefix--…’
The variable is intended for internal use and is defined in the file
prefix.el. (Emacs code contributed before 2018 may
follow other conventions, which are being phased out.)
- ‘…-internal’
The variable is intended for internal use and is defined in C code.
(Emacs code contributed before 2018 may follow other conventions,
which are being phased out.)
When you define a variable, always consider whether you should mark
it as safe or risky; see File Local Variables.
When defining and initializing a variable that holds a complicated
value (such as a syntax table for a major mode), it’s best to put the
entire computation of the value into the defvar
, like this:
(defvar my-major-mode-syntax-table
(let ((table (make-syntax-table)))
(modify-syntax-entry ?# "<" table)
…
table)
docstring)
This method has several benefits. First, if the user quits while
loading the file, the variable is either still uninitialized or
initialized properly, never in-between. If it is still uninitialized,
reloading the file will initialize it properly. Second, reloading the
file once the variable is initialized will not alter it; that is
important if the user has changed its value. Third, evaluating the
defvar
form with C-M-x will reinitialize the variable
completely.
12.7 Accessing Variable Values
The usual way to reference a variable is to write the symbol which
names it. See Symbol Forms.
Occasionally, you may want to reference a variable which is only
determined at run time. In that case, you cannot specify the variable
name in the text of the program. You can use the symbol-value
function to extract the value.
- Function: symbol-value symbol ¶
This function returns the value stored in symbol’s value cell.
This is where the variable’s current (dynamic) value is stored. If
the variable has no local binding, this is simply its global value.
If the variable is void, a void-variable
error is signaled.
If the variable is lexically bound, the value reported by
symbol-value
is not necessarily the same as the variable’s
lexical value, which is determined by the lexical environment rather
than the symbol’s value cell. See Scoping Rules for Variable Bindings.
(setq abracadabra 5)
⇒ 5
(setq foo 9)
⇒ 9
;; Here the symbol abracadabra
;; is the symbol whose value is examined.
(let ((abracadabra 'foo))
(symbol-value 'abracadabra))
⇒ foo
;; Here, the value of abracadabra
,
;; which is foo
,
;; is the symbol whose value is examined.
(let ((abracadabra 'foo))
(symbol-value abracadabra))
⇒ 9
(symbol-value 'abracadabra)
⇒ 5
12.8 Setting Variable Values
The usual way to change the value of a variable is with the special
form setq
. When you need to compute the choice of variable at
run time, use the function set
.
- Special Form: setq [symbol form]… ¶
This special form is the most common method of changing a variable’s
value. Each symbol is given a new value, which is the result of
evaluating the corresponding form. The current binding of the
symbol is changed.
setq
does not evaluate symbol; it sets the symbol that you
write. We say that this argument is automatically quoted. The
‘q’ in setq
stands for “quoted”.
The value of the setq
form is the value of the last form.
(setq x (1+ 2))
⇒ 3
x ; x
now has a global value.
⇒ 3
(let ((x 5))
(setq x 6) ; The local binding of x
is set.
x)
⇒ 6
x ; The global value is unchanged.
⇒ 3
Note that the first form is evaluated, then the first
symbol is set, then the second form is evaluated, then the
second symbol is set, and so on:
(setq x 10 ; Notice that x
is set before
y (1+ x)) ; the value of y
is computed.
⇒ 11
- Function: set symbol value ¶
This function puts value in the value cell of symbol.
Since it is a function rather than a special form, the expression
written for symbol is evaluated to obtain the symbol to set.
The return value is value.
When dynamic variable binding is in effect (the default), set
has the same effect as setq
, apart from the fact that
set
evaluates its symbol argument whereas setq
does not. But when a variable is lexically bound, set
affects
its dynamic value, whereas setq
affects its current
(lexical) value. See Scoping Rules for Variable Bindings.
(set one 1)
error→ Symbol's value as variable is void: one
(set 'one 1)
⇒ 1
(set 'two 'one)
⇒ one
(set two 2) ; two
evaluates to symbol one
.
⇒ 2
one ; So it is one
that was set.
⇒ 2
(let ((one 1)) ; This binding of one
is set,
(set 'one 3) ; not the global value.
one)
⇒ 3
one
⇒ 2
If symbol is not actually a symbol, a wrong-type-argument
error is signaled.
(set '(x y) 'z)
error→ Wrong type argument: symbolp, (x y)
- Macro: setopt [symbol form]… ¶
This is like setq
(see above), but meant for user options.
This macro uses the Customize machinery to set the variable(s)
(see Defining Customization Variables). In particular, setopt
will run
the setter function associated with the variable. For instance, if
you have:
(defcustom my-var 1
"My var."
:type 'number
:set (lambda (var val)
(set-default var val)
(message "We set %s to %s" var val)))
then the following, in addition to setting my-var
to ‘2’,
will also issue a message:
setopt
also checks whether the value is valid for the user
option. For instance, using setopt
to set a user option
defined with a number
type to a string will signal an error.
Unlike defcustom
and related customization commands, such as
customize-variable
, setopt
is meant for non-interactive
use, in particular in the user init file. For that reason, it doesn’t
record the standard, saved, and user-set values, and doesn’t mark the
variable as candidate for saving in the custom file.
The setopt
macro can be used on regular, non-user option
variables, but is much less efficient than setq
. The main use
case for this macro is setting user options in the user’s init file.
12.9 Running a function when a variable is changed.
It is sometimes useful to take some action when a variable changes its
value. The variable watchpoint facility provides the means to
do so. Some possible uses for this feature include keeping display in
sync with variable settings, and invoking the debugger to track down
unexpected changes to variables (see Entering the debugger when a variable is modified).
The following functions may be used to manipulate and query the watch
functions for a variable.
- Function: add-variable-watcher symbol watch-function ¶
This function arranges for watch-function to be called whenever
symbol is modified. Modifications through aliases
(see Variable Aliases) will have the same effect.
watch-function will be called, just before changing the value of
symbol, with 4 arguments: symbol, newval,
operation, and where.
symbol is the variable being changed. newval is the value
it will be changed to. (The old value is available to
watch-function as the value of symbol, since it was not
yet changed to newval.) operation is a symbol
representing the kind of change, one of: set
, let
,
unlet
, makunbound
, or defvaralias
. where
is a buffer if the buffer-local value of the variable is being
changed, nil
otherwise.
- Function: remove-variable-watcher symbol watch-function ¶
This function removes watch-function from symbol’s list of
watchers.
- Function: get-variable-watchers symbol ¶
This function returns the list of symbol’s active watcher
functions.
12.9.1 Limitations
There are a couple of ways in which a variable could be modified (or at
least appear to be modified) without triggering a watchpoint.
Since watchpoints are attached to symbols, modification to the
objects contained within variables (e.g., by a list modification
function see Modifying Existing List Structure) is not caught by this mechanism.
Additionally, C code can modify the value of variables directly,
bypassing the watchpoint mechanism.
A minor limitation of this feature, again because it targets symbols,
is that only variables of dynamic scope may be watched. This poses
little difficulty, since modifications to lexical variables can be
discovered easily by inspecting the code within the scope of the
variable (unlike dynamic variables, which can be modified by any code
at all, see Scoping Rules for Variable Bindings).
12.10 Scoping Rules for Variable Bindings
When you create a local binding for a variable, that binding takes
effect only within a limited portion of the program (see Local Variables). This section describes exactly what this means.
Each local binding has a certain scope and extent.
Scope refers to where in the textual source code the
binding can be accessed. Extent refers to when, as the
program is executing, the binding exists.
By default, the local bindings that Emacs creates are dynamic
bindings. Such a binding has dynamic scope, meaning that any
part of the program can potentially access the variable binding. It
also has dynamic extent, meaning that the binding lasts only
while the binding construct (such as the body of a let
form) is
being executed.
Emacs can optionally create lexical bindings. A lexical
binding has lexical scope, meaning that any reference to the
variable must be located textually within the binding
construct10. It also has
indefinite extent, meaning that under some circumstances the
binding can live on even after the binding construct has finished
executing, by means of special objects called closures.
The dynamic binding was (and still is) the default in Emacs for many
years, but lately Emacs is moving towards using lexical binding in
more and more places, with the goal of eventually making that the
default.
The following subsections describe dynamic binding and lexical
binding in greater detail, and how to enable lexical binding in Emacs
Lisp programs.
12.10.1 Dynamic Binding
By default, the local variable bindings made by Emacs are dynamic
bindings. When a variable is dynamically bound, its current binding
at any point in the execution of the Lisp program is simply the most
recently-created dynamic local binding for that symbol, or the global
binding if there is no such local binding.
Dynamic bindings have dynamic scope and extent, as shown by the
following example:
(defvar x -99) ; x
receives an initial value of -99.
(defun getx ()
x) ; x
is used free in this function.
(let ((x 1)) ; x
is dynamically bound.
(getx))
⇒ 1
;; After the let
form finishes, x
reverts to its
;; previous value, which is -99.
(getx)
⇒ -99
The function getx
refers to x
. This is a free
reference, in the sense that there is no binding for x
within
that defun
construct itself. When we call getx
from
within a let
form in which x
is (dynamically) bound, it
retrieves the local value (i.e., 1). But when we call getx
outside the let
form, it retrieves the global value (i.e.,
-99).
Here is another example, which illustrates setting a dynamically
bound variable using setq
:
(defvar x -99) ; x
receives an initial value of -99.
(defun addx ()
(setq x (1+ x))) ; Add 1 to x
and return its new value.
(let ((x 1))
(addx)
(addx))
⇒ 3 ; The two addx
calls add to x
twice.
;; After the let
form finishes, x
reverts to its
;; previous value, which is -99.
(addx)
⇒ -98
Dynamic binding is implemented in Emacs Lisp in a simple way. Each
symbol has a value cell, which specifies its current dynamic value (or
absence of value). See Symbol Components. When a symbol is given
a dynamic local binding, Emacs records the contents of the value cell
(or absence thereof) in a stack, and stores the new local value in the
value cell. When the binding construct finishes executing, Emacs pops
the old value off the stack, and puts it in the value cell.
Note that when code using Dynamic Binding is native compiled the
native compiler will not perform any Lisp specific optimization.
12.10.2 Proper Use of Dynamic Binding
Dynamic binding is a powerful feature, as it allows programs to
refer to variables that are not defined within their local textual
scope. However, if used without restraint, this can also make
programs hard to understand. There are two clean ways to use this
technique:
- If a variable has no global definition, use it as a local variable
only within a binding construct, such as the body of the
let
form where the variable was bound. If this convention is followed
consistently throughout a program, the value of the variable will not
affect, nor be affected by, any uses of the same variable symbol
elsewhere in the program.
- Otherwise, define the variable with
defvar
, defconst
(see Defining Global Variables), or defcustom
(see Defining Customization Variables). Usually, the definition should be at top-level in an
Emacs Lisp file. As far as possible, it should include a
documentation string which explains the meaning and purpose of the
variable. You should also choose the variable’s name to avoid name
conflicts (see Emacs Lisp Coding Conventions).
Then you can bind the variable anywhere in a program, knowing reliably
what the effect will be. Wherever you encounter the variable, it will
be easy to refer back to the definition, e.g., via the C-h v
command (provided the variable definition has been loaded into Emacs).
See Name Help in The GNU Emacs Manual.
For example, it is common to use local bindings for customizable
variables like case-fold-search
:
(defun search-for-abc ()
"Search for the string \"abc\", ignoring case differences."
(let ((case-fold-search t))
(re-search-forward "abc")))
12.10.3 Lexical Binding
Lexical binding was introduced to Emacs, as an optional feature, in
version 24.1. We expect its importance to increase with time.
Lexical binding opens up many more opportunities for optimization, so
programs using it are likely to run faster in future Emacs versions.
Lexical binding is also more compatible with concurrency, which was
added to Emacs in version 26.1.
A lexically-bound variable has lexical scope, meaning that any
reference to the variable must be located textually within the binding
construct. Here is an example
(see Using Lexical Binding, for how to actually enable lexical binding):
(let ((x 1)) ; x
is lexically bound.
(+ x 3))
⇒ 4
(defun getx ()
x) ; x
is used free in this function.
(let ((x 1)) ; x
is lexically bound.
(getx))
error→ Symbol's value as variable is void: x
Here, the variable x
has no global value. When it is lexically
bound within a let
form, it can be used in the textual confines
of that let
form. But it can not be used from within a
getx
function called from the let
form, since the
function definition of getx
occurs outside the let
form
itself.
Here is how lexical binding works. Each binding construct defines a
lexical environment, specifying the variables that are bound
within the construct and their local values. When the Lisp evaluator
wants the current value of a variable, it looks first in the lexical
environment; if the variable is not specified in there, it looks in
the symbol’s value cell, where the dynamic value is stored.
(Internally, the lexical environment is a list whose members are
usually cons cells that are symbol-value pairs, but some of its
members can be symbols rather than cons cells. A symbol in the list
means the lexical environment declared that symbol’s variable as
locally considered to be dynamically bound. This list can be passed
as the second argument to the eval
function, in order to
specify a lexical environment in which to evaluate a form.
See Eval. Most Emacs Lisp programs, however, should not interact
directly with lexical environments in this way; only specialized
programs like debuggers.)
Lexical bindings have indefinite extent. Even after a binding
construct has finished executing, its lexical environment can be
“kept around” in Lisp objects called closures. A closure is
created when you define a named or anonymous function with lexical
binding enabled. See Closures, for details.
When a closure is called as a function, any lexical variable
references within its definition use the retained lexical environment.
Here is an example:
(defvar my-ticker nil) ; We will use this dynamically bound
; variable to store a closure.
(let ((x 0)) ; x
is lexically bound.
(setq my-ticker (lambda ()
(setq x (1+ x)))))
⇒ (closure ((x . 0)) ()
(setq x (1+ x)))
(funcall my-ticker)
⇒ 1
(funcall my-ticker)
⇒ 2
(funcall my-ticker)
⇒ 3
x ; Note that x
has no global value.
error→ Symbol's value as variable is void: x
The let
binding defines a lexical environment in which the
variable x
is locally bound to 0. Within this binding
construct, we define a lambda expression which increments x
by
one and returns the incremented value. This lambda expression is
automatically turned into a closure, in which the lexical environment
lives on even after the let
binding construct has exited. Each
time we evaluate the closure, it increments x
, using the
binding of x
in that lexical environment.
Note that unlike dynamic variables which are tied to the symbol
object itself, the relationship between lexical variables and symbols
is only present in the interpreter (or compiler). Therefore,
functions which take a symbol argument (like symbol-value
,
boundp
, and set
) can only retrieve or modify a
variable’s dynamic binding (i.e., the contents of its symbol’s value
cell).
12.10.4 Using Lexical Binding
When loading an Emacs Lisp file or evaluating a Lisp buffer, lexical
binding is enabled if the buffer-local variable lexical-binding
is non-nil
:
- Variable: lexical-binding ¶
If this buffer-local variable is non-nil
, Emacs Lisp files and
buffers are evaluated using lexical binding instead of dynamic
binding. (However, special variables are still dynamically bound; see
below.) If nil
, dynamic binding is used for all local
variables. This variable is typically set for a whole Emacs Lisp
file, as a file local variable (see File Local Variables).
Note that unlike other such variables, this one must be set in the
first line of a file.
When evaluating Emacs Lisp code directly using an eval
call,
lexical binding is enabled if the lexical argument to
eval
is non-nil
. See Eval.
Lexical binding is also enabled in Lisp Interaction and IELM mode,
used in the *scratch* and *ielm* buffers, and also when
evaluating expressions via M-: (eval-expression
) and when
processing the --eval command-line options of Emacs
(see Action Arguments in The GNU Emacs Manual) and
emacsclient
(see emacsclient Options in The GNU
Emacs Manual).
Even when lexical binding is enabled, certain variables will
continue to be dynamically bound. These are called special
variables. Every variable that has been defined with defvar
,
defcustom
or defconst
is a special variable
(see Defining Global Variables). All other variables are subject to
lexical binding.
Using defvar
without a value, it is possible to bind a variable
dynamically just in one file, or in just one part of a file while
still binding it lexically elsewhere. For example:
(let (_)
(defvar x) ; Let-bindings of x
will be dynamic within this let.
(let ((x -99)) ; This is a dynamic binding of x
.
(defun get-dynamic-x ()
x)))
(let ((x 'lexical)) ; This is a lexical binding of x
.
(defun get-lexical-x ()
x))
(let (_)
(defvar x)
(let ((x 'dynamic))
(list (get-lexical-x)
(get-dynamic-x))))
⇒ (lexical dynamic)
- Function: special-variable-p symbol ¶
This function returns non-nil
if symbol is a special
variable (i.e., it has a defvar
, defcustom
, or
defconst
variable definition). Otherwise, the return value is
nil
.
Note that since this is a function, it can only return
non-nil
for variables which are permanently special, but not
for those that are only special in the current lexical scope.
The use of a special variable as a formal argument in a function is
not supported.
12.10.5 Converting to Lexical Binding
Converting an Emacs Lisp program to lexical binding is easy. First,
add a file-local variable setting of lexical-binding
to
t
in the header line of the Emacs Lisp source file (see File Local Variables). Second, check that every variable in the program
which needs to be dynamically bound has a variable definition, so that
it is not inadvertently bound lexically.
A simple way to find out which variables need a variable definition
is to byte-compile the source file. See Byte Compilation. If a
non-special variable is used outside of a let
form, the
byte-compiler will warn about reference or assignment to a free
variable. If a non-special variable is bound but not used within a
let
form, the byte-compiler will warn about an unused lexical
variable. The byte-compiler will also issue a warning if you use a
special variable as a function argument.
A warning about a reference or an assignment to a free variable is
usually a clear sign that that variable should be marked as
dynamically scoped, so you need to add an appropriate defvar
before the first use of that variable.
A warning about an unused variable may be a good hint that the
variable was intended to be dynamically scoped (because it is actually
used, but in another function), but it may also be an indication that
the variable is simply really not used and could simply be removed.
So you need to find out which case it is, and based on that, either
add a defvar
or remove the variable altogether. If removal is
not possible or not desirable (typically because it is a formal
argument and that we cannot or don’t want to change all the callers),
you can also add a leading underscore to the variable’s name to
indicate to the compiler that this is a variable known not to
be used.)
Cross-file variable checking
Caution: This is an experimental feature that may change or
disappear without prior notice.
The byte-compiler can also warn about lexical variables that are
special in other Emacs Lisp files, often indicating a missing
defvar
declaration. This useful but somewhat specialized check
requires three steps:
- Byte-compile all files whose special variable declarations may be of
interest, with the environment variable
EMACS_GENERATE_DYNVARS
set to a nonempty string. These are typically all the files in the
same package or related packages or Emacs subsystems. The process
will generate a file whose name ends in .dynvars for each
compiled Emacs Lisp file.
- Concatenate the .dynvars files into a single file.
- Byte-compile the files that need to be checked, this time with
the environment variable
EMACS_DYNVARS_FILE
set to the name
of the aggregated file created in step 2.
Here is an example illustrating how this could be done, assuming that
a Unix shell and make
are used for byte-compilation:
$ rm *.elc # force recompilation
$ EMACS_GENERATE_DYNVARS=1 make # generate .dynvars
$ cat *.dynvars > ~/my-dynvars # combine .dynvars
$ rm *.elc # force recompilation
$ EMACS_DYNVARS_FILE=~/my-dynvars make # perform checks
12.11 Buffer-Local Variables
Global and local variable bindings are found in most programming
languages in one form or another. Emacs, however, also supports
additional, unusual kinds of variable binding, such as
buffer-local bindings, which apply only in one buffer. Having
different values for a variable in different buffers is an important
customization method. (Variables can also have bindings that are
local to each terminal. See Multiple Terminals.)
12.11.1 Introduction to Buffer-Local Variables
A buffer-local variable has a buffer-local binding associated with a
particular buffer. The binding is in effect when that buffer is
current; otherwise, it is not in effect. If you set the variable while
a buffer-local binding is in effect, the new value goes in that binding,
so its other bindings are unchanged. This means that the change is
visible only in the buffer where you made it.
The variable’s ordinary binding, which is not associated with any
specific buffer, is called the default binding. In most cases,
this is the global binding.
A variable can have buffer-local bindings in some buffers but not in
other buffers. The default binding is shared by all the buffers that
don’t have their own bindings for the variable. (This includes all
newly-created buffers.) If you set the variable in a buffer that does
not have a buffer-local binding for it, this sets the default binding,
so the new value is visible in all the buffers that see the default
binding.
The most common use of buffer-local bindings is for major modes to change
variables that control the behavior of commands. For example, C mode and
Lisp mode both set the variable paragraph-start
to specify that only
blank lines separate paragraphs. They do this by making the variable
buffer-local in the buffer that is being put into C mode or Lisp mode, and
then setting it to the new value for that mode. See Major Modes.
The usual way to make a buffer-local binding is with
make-local-variable
, which is what major mode commands typically
use. This affects just the current buffer; all other buffers (including
those yet to be created) will continue to share the default value unless
they are explicitly given their own buffer-local bindings.
A more powerful operation is to mark the variable as
automatically buffer-local by calling
make-variable-buffer-local
. You can think of this as making the
variable local in all buffers, even those yet to be created. More
precisely, the effect is that setting the variable automatically makes
the variable local to the current buffer if it is not already so. All
buffers start out by sharing the default value of the variable as usual,
but setting the variable creates a buffer-local binding for the current
buffer. The new value is stored in the buffer-local binding, leaving
the default binding untouched. This means that the default value cannot
be changed with setq
in any buffer; the only way to change it is
with setq-default
.
Warning: When a variable has buffer-local
bindings in one or more buffers, let
rebinds the binding that’s
currently in effect. For instance, if the current buffer has a
buffer-local value, let
temporarily rebinds that. If no
buffer-local bindings are in effect, let
rebinds
the default value. If inside the let
you then change to a
different current buffer in which a different binding is in effect,
you won’t see the let
binding any more. And if you exit the
let
while still in the other buffer, you won’t see the
unbinding occur (though it will occur properly). Here is an example
to illustrate:
(setq foo 'g)
(set-buffer "a")
(make-local-variable 'foo)
(setq foo 'a)
(let ((foo 'temp))
;; foo ⇒ 'temp ; let binding in buffer ‘a’
(set-buffer "b")
;; foo ⇒ 'g ; the global value since foo is not local in ‘b’
body…)
foo ⇒ 'g ; exiting restored the local value in buffer ‘a’,
; but we don’t see that in buffer ‘b’
(set-buffer "a") ; verify the local value was restored
foo ⇒ 'a
Note that references to foo
in body access the
buffer-local binding of buffer ‘b’.
When a file specifies local variable values, these become buffer-local
values when you visit the file. See File Variables in The
GNU Emacs Manual.
A buffer-local variable cannot be made terminal-local
(see Multiple Terminals).
12.11.2 Creating and Deleting Buffer-Local Bindings
- Command: make-local-variable variable ¶
This function creates a buffer-local binding in the current buffer for
variable (a symbol). Other buffers are not affected. The value
returned is variable.
The buffer-local value of variable starts out as the same value
variable previously had. If variable was void, it remains
void.
;; In buffer ‘b1’:
(setq foo 5) ; Affects all buffers.
⇒ 5
(make-local-variable 'foo) ; Now it is local in ‘b1’.
⇒ foo
foo ; That did not change
⇒ 5 ; the value.
(setq foo 6) ; Change the value
⇒ 6 ; in ‘b1’.
foo
⇒ 6
;; In buffer ‘b2’, the value hasn’t changed.
(with-current-buffer "b2"
foo)
⇒ 5
Making a variable buffer-local within a let
-binding for that
variable does not work reliably, unless the buffer in which you do this
is not current either on entry to or exit from the let
. This is
because let
does not distinguish between different kinds of
bindings; it knows only which variable the binding was made for.
It is an error to make a constant or a read-only variable
buffer-local. See Variables that Never Change.
If the variable is terminal-local (see Multiple Terminals), this
function signals an error. Such variables cannot have buffer-local
bindings as well.
Warning: do not use make-local-variable
for a hook
variable. The hook variables are automatically made buffer-local as
needed if you use the local argument to add-hook
or
remove-hook
.
- Macro: setq-local &rest pairs ¶
pairs is a list of variable and value pairs. This macro creates
a buffer-local binding in the current buffer for each of the
variables, and gives them a buffer-local value. It is equivalent to
calling make-local-variable
followed by setq
for each of
the variables. The variables should be unquoted symbols.
(setq-local var1 "value1"
var2 "value2")
- Command: make-variable-buffer-local variable ¶
This function marks variable (a symbol) automatically
buffer-local, so that any subsequent attempt to set it will make it
local to the current buffer at the time. Unlike
make-local-variable
, with which it is often confused, this
cannot be undone, and affects the behavior of the variable in all
buffers.
A peculiar wrinkle of this feature is that binding the variable (with
let
or other binding constructs) does not create a buffer-local
binding for it. Only setting the variable (with set
or
setq
), while the variable does not have a let
-style
binding that was made in the current buffer, does so.
If variable does not have a default value, then calling this
command will give it a default value of nil
. If variable
already has a default value, that value remains unchanged.
Subsequently calling makunbound
on variable will result
in a void buffer-local value and leave the default value unaffected.
The value returned is variable.
It is an error to make a constant or a read-only variable
buffer-local. See Variables that Never Change.
Warning: Don’t assume that you should use
make-variable-buffer-local
for user-option variables, simply
because users might want to customize them differently in
different buffers. Users can make any variable local, when they wish
to. It is better to leave the choice to them.
The time to use make-variable-buffer-local
is when it is crucial
that no two buffers ever share the same binding. For example, when a
variable is used for internal purposes in a Lisp program which depends
on having separate values in separate buffers, then using
make-variable-buffer-local
can be the best solution.
- Macro: defvar-local variable value &optional docstring ¶
This macro defines variable as a variable with initial value
value and docstring, and marks it as automatically
buffer-local. It is equivalent to calling defvar
followed by
make-variable-buffer-local
. variable should be an
unquoted symbol.
- Function: local-variable-p variable &optional buffer ¶
This returns t
if variable is buffer-local in buffer
buffer (which defaults to the current buffer); otherwise,
nil
.
- Function: local-variable-if-set-p variable &optional buffer ¶
This returns t
if variable either has a buffer-local
value in buffer buffer, or is automatically buffer-local.
Otherwise, it returns nil
. If omitted or nil
,
buffer defaults to the current buffer.
- Function: buffer-local-value variable buffer ¶
This function returns the buffer-local binding of variable (a
symbol) in buffer buffer. If variable does not have a
buffer-local binding in buffer buffer, it returns the default
value (see The Default Value of a Buffer-Local Variable) of variable instead.
- Function: buffer-local-boundp variable buffer ¶
This returns non-nil
if there’s either a buffer-local binding
of variable (a symbol) in buffer buffer, or variable
has a global binding.
- Function: buffer-local-variables &optional buffer ¶
This function returns a list describing the buffer-local variables in
buffer buffer. (If buffer is omitted, the current buffer
is used.) Normally, each list element has the form
(sym . val)
, where sym is a buffer-local
variable (a symbol) and val is its buffer-local value. But when
a variable’s buffer-local binding in buffer is void, its list
element is just sym.
(make-local-variable 'foobar)
(makunbound 'foobar)
(make-local-variable 'bind-me)
(setq bind-me 69)
(setq lcl (buffer-local-variables))
;; First, built-in variables local in all buffers:
⇒ ((mark-active . nil)
(buffer-undo-list . nil)
(mode-name . "Fundamental")
…
;; Next, non-built-in buffer-local variables.
;; This one is buffer-local and void:
foobar
;; This one is buffer-local and nonvoid:
(bind-me . 69))
Note that storing new values into the CDRs of cons cells in this
list does not change the buffer-local values of the variables.
- Command: kill-local-variable variable ¶
This function deletes the buffer-local binding (if any) for
variable (a symbol) in the current buffer. As a result, the
default binding of variable becomes visible in this buffer. This
typically results in a change in the value of variable, since the
default value is usually different from the buffer-local value just
eliminated.
If you kill the buffer-local binding of a variable that automatically
becomes buffer-local when set, this makes the default value visible in
the current buffer. However, if you set the variable again, that will
once again create a buffer-local binding for it.
kill-local-variable
returns variable.
This function is a command because it is sometimes useful to kill one
buffer-local variable interactively, just as it is useful to create
buffer-local variables interactively.
- Function: kill-all-local-variables &optional kill-permanent ¶
This function eliminates all the buffer-local variable bindings of the
current buffer. As a result, the buffer will see the default values
of most variables. By default, for variables marked as permanent and
local hook functions that have a non-nil
permanent-local-hook
property (see Setting Hooks) won’t be
killed, but if the optional kill-permanent argument is
non-nil
, even these variables will be killed.
This function also resets certain other information pertaining to the
buffer: it sets the local keymap to nil
, the syntax table to the
value of (standard-syntax-table)
, the case table to
(standard-case-table)
, and the abbrev table to the value of
fundamental-mode-abbrev-table
.
The very first thing this function does is run the normal hook
change-major-mode-hook
(see below).
Every major mode command begins by calling this function, which has the
effect of switching to Fundamental mode and erasing most of the effects
of the previous major mode. To ensure that this does its job, the
variables that major modes set should not be marked permanent.
kill-all-local-variables
returns nil
.
- Variable: change-major-mode-hook ¶
The function kill-all-local-variables
runs this normal hook
before it does anything else. This gives major modes a way to arrange
for something special to be done if the user switches to a different
major mode. It is also useful for buffer-specific minor modes
that should be forgotten if the user changes the major mode.
For best results, make this variable buffer-local, so that it will
disappear after doing its job and will not interfere with the
subsequent major mode. See Hooks.
A buffer-local variable is permanent if the variable name (a
symbol) has a permanent-local
property that is non-nil
.
Such variables are unaffected by kill-all-local-variables
, and
their local bindings are therefore not cleared by changing major modes.
Permanent locals are appropriate for data pertaining to where the file
came from or how to save it, rather than with how to edit the contents.
12.11.3 The Default Value of a Buffer-Local Variable
The global value of a variable with buffer-local bindings is also
called the default value, because it is the value that is in
effect whenever neither the current buffer nor the selected frame has
its own binding for the variable.
The functions default-value
and setq-default
access and
change a variable’s default value regardless of whether the current
buffer has a buffer-local binding. For example, you could use
setq-default
to change the default setting of
paragraph-start
for most buffers; and this would work even when
you are in a C or Lisp mode buffer that has a buffer-local value for
this variable.
The special forms defvar
and defconst
also set the
default value (if they set the variable at all), rather than any
buffer-local value.
- Function: default-value symbol ¶
This function returns symbol’s default value. This is the value
that is seen in buffers and frames that do not have their own values for
this variable. If symbol is not buffer-local, this is equivalent
to symbol-value
(see Accessing Variable Values).
- Function: default-boundp symbol ¶
The function default-boundp
tells you whether symbol’s
default value is nonvoid. If (default-boundp 'foo)
returns
nil
, then (default-value 'foo)
would get an error.
default-boundp
is to default-value
as boundp
is to
symbol-value
.
- Special Form: setq-default [symbol form]… ¶
This special form gives each symbol a new default value, which is
the result of evaluating the corresponding form. It does not
evaluate symbol, but does evaluate form. The value of the
setq-default
form is the value of the last form.
If a symbol is not buffer-local for the current buffer, and is not
marked automatically buffer-local, setq-default
has the same
effect as setq
. If symbol is buffer-local for the current
buffer, then this changes the value that other buffers will see (as long
as they don’t have a buffer-local value), but not the value that the
current buffer sees.
;; In buffer ‘foo’:
(make-local-variable 'buffer-local)
⇒ buffer-local
(setq buffer-local 'value-in-foo)
⇒ value-in-foo
(setq-default buffer-local 'new-default)
⇒ new-default
buffer-local
⇒ value-in-foo
(default-value 'buffer-local)
⇒ new-default
;; In (the new) buffer ‘bar’:
buffer-local
⇒ new-default
(default-value 'buffer-local)
⇒ new-default
(setq buffer-local 'another-default)
⇒ another-default
(default-value 'buffer-local)
⇒ another-default
;; Back in buffer ‘foo’:
buffer-local
⇒ value-in-foo
(default-value 'buffer-local)
⇒ another-default
- Function: set-default symbol value ¶
This function is like setq-default
, except that symbol is
an ordinary evaluated argument.
(set-default (car '(a b c)) 23)
⇒ 23
(default-value 'a)
⇒ 23
A variable can be let-bound (see Local Variables) to a value.
This makes its global value shadowed by the binding;
default-value
will then return the value from that binding, not
the global value, and set-default
will be prevented from
setting the global value (it will change the let-bound value instead).
The following two functions allow to reference the global value even
if it’s shadowed by a let-binding.
- Function: default-toplevel-value symbol ¶
This function returns the top-level default value of
symbol, which is its value outside of any let-binding.
(defvar variable 'global-value)
⇒ variable
(let ((variable 'let-binding))
(default-value 'variable))
⇒ let-binding
(let ((variable 'let-binding))
(default-toplevel-value 'variable))
⇒ global-value
- Function: set-default-toplevel-value symbol value ¶
This function sets the top-level default value of symbol to the
specified value. This comes in handy when you want to set the
global value of symbol regardless of whether your code runs in
the context of symbol’s let-binding.
12.12 File Local Variables
A file can specify local variable values; Emacs uses these to create
buffer-local bindings for those variables in the buffer visiting that
file. See Local Variables in Files in The
GNU Emacs Manual, for basic information about file-local variables.
This section describes the functions and variables that affect how
file-local variables are processed.
If a file-local variable could specify an arbitrary function or Lisp
expression that would be called later, visiting a file could take over
your Emacs. Emacs protects against this by automatically setting only
those file-local variables whose specified values are known to be
safe. Other file-local variables are set only if the user agrees.
For additional safety, read-circle
is temporarily bound to
nil
when Emacs reads file-local variables (see Input Functions). This prevents the Lisp reader from recognizing circular
and shared Lisp structures (see Read Syntax for Circular Objects).
- User Option: enable-local-variables ¶
This variable controls whether to process file-local variables.
The possible values are:
t
(the default)
Set the safe variables, and query (once) about any unsafe variables.
:safe
Set only the safe variables and do not query.
:all
Set all the variables and do not query.
nil
Don’t set any variables.
- anything else
Query (once) about all the variables.
- Variable: inhibit-local-variables-regexps ¶
This is a list of regular expressions. If a file has a name
matching an element of this list, then it is not scanned for
any form of file-local variable. For examples of why you might want
to use this, see How Emacs Chooses a Major Mode.
- Variable: permanently-enabled-local-variables ¶
Some local variable settings will, by default, be heeded even if
enable-local-variables
is nil
. By default, this is only
the case for the lexical-binding
local variable setting, but
this can be controlled by using this variable, which is a list of
symbols.
- Function: hack-local-variables &optional handle-mode ¶
This function parses, and binds or evaluates as appropriate, any local
variables specified by the contents of the current buffer. The variable
enable-local-variables
has its effect here. However, this
function does not look for the ‘mode:’ local variable in the
‘-*-’ line. set-auto-mode
does that, also taking
enable-local-variables
into account (see How Emacs Chooses a Major Mode).
This function works by walking the alist stored in
file-local-variables-alist
and applying each local variable in
turn. It calls before-hack-local-variables-hook
and
hack-local-variables-hook
before and after applying the
variables, respectively. It only calls the before-hook if the alist
is non-nil
; it always calls the other hook. This
function ignores a ‘mode’ element if it specifies the same major
mode as the buffer already has.
If the optional argument handle-mode is t
, then all this
function does is return a symbol specifying the major mode, if the
‘-*-’ line or the local variables list specifies one, and
nil
otherwise. It does not set the mode or any other
file-local variable. If handle-mode has any value other than
nil
or t
, any settings of ‘mode’ in the
‘-*-’ line or the local variables list are ignored, and the
other settings are applied. If handle-mode is nil
, all
the file local variables are set.
- Variable: file-local-variables-alist ¶
This buffer-local variable holds the alist of file-local variable
settings. Each element of the alist is of the form
(var . value)
, where var is a symbol of
the local variable and value is its value. When Emacs visits a
file, it first collects all the file-local variables into this alist,
and then the hack-local-variables
function applies them one by
one.
- Variable: before-hack-local-variables-hook ¶
Emacs calls this hook immediately before applying file-local variables
stored in file-local-variables-alist
.
- Variable: hack-local-variables-hook ¶
Emacs calls this hook immediately after it finishes applying
file-local variables stored in file-local-variables-alist
.
You can specify safe values for a variable with a
safe-local-variable
property. The property has to be a
function of one argument; any value is safe if the function returns
non-nil
given that value. Many commonly-encountered file
variables have safe-local-variable
properties; these include
fill-column
, fill-prefix
, and indent-tabs-mode
.
For boolean-valued variables that are safe, use booleanp
as the
property value.
If you want to define safe-local-variable
properties for
variables defined in C source code, add the names and the properties
of those variables to the list in the “Safe local variables” section
of files.el.
When defining a user option using defcustom
, you can set its
safe-local-variable
property by adding the arguments
:safe function
to defcustom
(see Defining Customization Variables). However, a safety predicate defined using :safe
will only be known once the package that contains the defcustom
is loaded, which is often too late. As an alternative, you can use
the autoload cookie (see Autoload) to assign the option its safety
predicate, like this:
;;;###autoload (put 'var 'safe-local-variable 'pred)
The safe value definitions specified with autoload
are copied
into the package’s autoloads file (loaddefs.el for most
packages bundled with Emacs), and are known to Emacs since the
beginning of a session.
- User Option: safe-local-variable-values ¶
This variable provides another way to mark some variable values as
safe. It is a list of cons cells (var . val)
,
where var is a variable name and val is a value which is
safe for that variable.
When Emacs asks the user whether or not to obey a set of file-local
variable specifications, the user can choose to mark them as safe.
Doing so adds those variable/value pairs to
safe-local-variable-values
, and saves it to the user’s custom
file.
- User Option: ignored-local-variable-values ¶
If there are some values of particular local variables that you always
want to ignore completely, you can use this variable. Its value has
the same form as safe-local-variable-values
; a file-local
variable setting to the value that appears in the list will always be
ignored when processing the local variables specified by the file. As
with that variable, when Emacs queries the user about whether to obey
file-local variables, the user can choose to ignore their particular
values permanently, and that will alter this variable and save it to
the user’s custom file. Variable-value pairs that appear in this
variable take precedence over the same pairs in
safe-local-variable-values
.
- Function: safe-local-variable-p sym val ¶
This function returns non-nil
if it is safe to give sym
the value val, based on the above criteria.
Some variables are considered risky. If a variable is risky,
it is never entered automatically into
safe-local-variable-values
; Emacs always queries before setting
a risky variable, unless the user explicitly allows a value by
customizing safe-local-variable-values
directly.
Any variable whose name has a non-nil
risky-local-variable
property is considered risky. When you
define a user option using defcustom
, you can set its
risky-local-variable
property by adding the arguments
:risky value
to defcustom
(see Defining Customization Variables). In addition, any variable whose name ends in any of
‘-command’, ‘-frame-alist’, ‘-function’,
‘-functions’, ‘-hook’, ‘-hooks’, ‘-form’,
‘-forms’, ‘-map’, ‘-map-alist’, ‘-mode-alist’,
‘-program’, or ‘-predicate’ is automatically considered
risky. The variables ‘font-lock-keywords’,
‘font-lock-keywords’ followed by a digit, and
‘font-lock-syntactic-keywords’ are also considered risky.
- Function: risky-local-variable-p sym ¶
This function returns non-nil
if sym is a risky variable,
based on the above criteria.
- Variable: ignored-local-variables ¶
This variable holds a list of variables that should not be given local
values by files. Any value specified for one of these variables is
completely ignored.
The ‘Eval:’ “variable” is also a potential loophole, so Emacs
normally asks for confirmation before handling it.
- User Option: enable-local-eval ¶
This variable controls processing of ‘Eval:’ in ‘-*-’ lines
or local variables
lists in files being visited. A value of t
means process them
unconditionally; nil
means ignore them; anything else means ask
the user what to do for each file. The default value is maybe
.
- User Option: safe-local-eval-forms ¶
This variable holds a list of expressions that are safe to
evaluate when found in the ‘Eval:’ “variable” in a file
local variables list.
If the expression is a function call and the function has a
safe-local-eval-function
property, the property value
determines whether the expression is safe to evaluate. The property
value can be a predicate to call to test the expression, a list of
such predicates (it’s safe if any predicate succeeds), or t
(always safe provided the arguments are constant).
Text properties are also potential loopholes, since their values
could include functions to call. So Emacs discards all text
properties from string values specified for file-local variables.
12.13 Directory Local Variables
A directory can specify local variable values common to all files in
that directory; Emacs uses these to create buffer-local bindings for
those variables in buffers visiting any file in that directory. This
is useful when the files in the directory belong to some project
and therefore share the same local variables.
There are two different methods for specifying directory local
variables: by putting them in a special file, or by defining a
project class for that directory.
- Constant: dir-locals-file ¶
This constant is the name of the file where Emacs expects to find the
directory-local variables. The name of the file is
.dir-locals.el11. A file by that name in a directory causes Emacs to apply its
settings to any file in that directory or any of its subdirectories
(optionally, you can exclude subdirectories; see below).
If some of the subdirectories have their own .dir-locals.el
files, Emacs uses the settings from the deepest file it finds starting
from the file’s directory and moving up the directory tree. This
constant is also used to derive the name of a second dir-locals file
.dir-locals-2.el. If this second dir-locals file is present,
then that is loaded in addition to .dir-locals.el. This is useful
when .dir-locals.el is under version control in a shared
repository and cannot be used for personal customizations. The file
specifies local variables as a specially formatted list; see
Per-directory Local Variables in The
GNU Emacs Manual, for more details.
- Function: hack-dir-local-variables ¶
This function reads the .dir-locals.el
file and stores the
directory-local variables in file-local-variables-alist
that is
local to the buffer visiting any file in the directory, without
applying them. It also stores the directory-local settings in
dir-locals-class-alist
, where it defines a special class for
the directory in which .dir-locals.el file was found. This
function works by calling dir-locals-set-class-variables
and
dir-locals-set-directory-class
, described below.
- Function: hack-dir-local-variables-non-file-buffer ¶
This function looks for directory-local variables, and immediately
applies them in the current buffer. It is intended to be called in
the mode commands for non-file buffers, such as Dired buffers, to let
them obey directory-local variable settings. For non-file buffers,
Emacs looks for directory-local variables in default-directory
and its parent directories.
- Function: dir-locals-set-class-variables class variables ¶
This function defines a set of variable settings for the named
class, which is a symbol. You can later assign the class to one
or more directories, and Emacs will apply those variable settings to
all files in those directories. The list in variables can be of
one of the two forms: (major-mode . alist)
or
(directory . list)
. With the first form, if the
file’s buffer turns on a mode that is derived from major-mode,
then all the variables in the associated alist are applied;
alist should be of the form (name . value)
.
A special value nil
for major-mode means the settings are
applicable to any mode. In alist, you can use a special
name: subdirs
. If the associated value is
nil
, the alist is only applied to files in the relevant
directory, not to those in any subdirectories.
With the second form of variables, if directory is the
initial substring of the file’s directory, then list is applied
recursively by following the above rules; list should be of one
of the two forms accepted by this function in variables.
- Function: dir-locals-set-directory-class directory class &optional mtime ¶
This function assigns class to all the files in directory
and its subdirectories. Thereafter, all the variable settings
specified for class will be applied to any visited file in
directory and its children. class must have been already
defined by dir-locals-set-class-variables
.
Emacs uses this function internally when it loads directory variables
from a .dir-locals.el
file. In that case, the optional
argument mtime holds the file modification time (as returned by
file-attributes
). Emacs uses this time to check stored
local variables are still valid. If you are assigning a class
directly, not via a file, this argument should be nil
.
- Variable: dir-locals-class-alist ¶
This alist holds the class symbols and the associated variable
settings. It is updated by dir-locals-set-class-variables
.
- Variable: dir-locals-directory-cache ¶
This alist holds directory names, their assigned class names, and
modification times of the associated directory local variables file
(if there is one). The function dir-locals-set-directory-class
updates this list.
- Variable: enable-dir-local-variables ¶
If nil
, directory-local variables are ignored. This variable
may be useful for modes that want to ignore directory-locals while
still respecting file-local variables (see File Local Variables).
12.14 Connection Local Variables
Connection-local variables provide a general mechanism for different
variable settings in buffers with a remote connection (see Remote Files in The GNU Emacs Manual). They are bound
and set depending on the remote connection a buffer is dedicated to.
12.14.1 Connection Local Profiles
Emacs uses connection-local profiles to store the variable settings
to apply to particular connections. You can then associate these with
remote connections by defining the criteria when they should apply,
using connection-local-set-profiles
.
- Function: connection-local-set-profile-variables profile variables ¶
This function defines a set of variable settings for the connection
profile, which is a symbol. You can later assign the connection
profile to one or more remote connections, and Emacs will apply those
variable settings to all process buffers for those connections. The
list in variables is an alist of the form
(name . value)
. Example:
(connection-local-set-profile-variables
'remote-bash
'((shell-file-name . "/bin/bash")
(shell-command-switch . "-c")
(shell-interactive-switch . "-i")
(shell-login-switch . "-l")))
(connection-local-set-profile-variables
'remote-ksh
'((shell-file-name . "/bin/ksh")
(shell-command-switch . "-c")
(shell-interactive-switch . "-i")
(shell-login-switch . "-l")))
(connection-local-set-profile-variables
'remote-null-device
'((null-device . "/dev/null")))
If you want to append variable settings to an existing profile, you
could use the function connection-local-get-profile-variables
in order to retrieve the existing settings, like
(connection-local-set-profile-variables
'remote-bash
(append
(connection-local-get-profile-variables 'remote-bash)
'((shell-command-dont-erase-buffer . t))))
- User Option: connection-local-profile-alist ¶
This alist holds the connection profile symbols and the associated
variable settings. It is updated by
connection-local-set-profile-variables
.
- Function: connection-local-set-profiles criteria &rest profiles ¶
This function assigns profiles, which are symbols, to all remote
connections identified by criteria. criteria is a plist
identifying a connection and the application using this connection.
Property names might be :application
, :protocol
,
:user
and :machine
. The property value of
:application
is a symbol, all other property values are
strings. All properties are optional; if criteria is nil
, it
always applies. Example:
(connection-local-set-profiles
'(:application tramp :protocol "ssh" :machine "localhost")
'remote-bash 'remote-null-device)
(connection-local-set-profiles
'(:application tramp :protocol "sudo"
:user "root" :machine "localhost")
'remote-ksh 'remote-null-device)
If criteria is nil
, it applies for all remote connections.
Therefore, the example above would be equivalent to
(connection-local-set-profiles
'(:application tramp :protocol "ssh" :machine "localhost")
'remote-bash)
(connection-local-set-profiles
'(:application tramp :protocol "sudo"
:user "root" :machine "localhost")
'remote-ksh)
(connection-local-set-profiles
nil 'remote-null-device)
Any connection profile of profiles must have been already
defined by connection-local-set-profile-variables
.
- User Option: connection-local-criteria-alist ¶
This alist contains connection criteria and their assigned profile
names. The function connection-local-set-profiles
updates this
list.
12.14.2 Applying Connection Local Variables
When writing connection-aware code, you’ll need to collect, and
possibly apply, any connection-local variables. There are several
ways to do this, as described below.
- Function: hack-connection-local-variables criteria ¶
This function collects applicable connection-local variables
associated with criteria in
connection-local-variables-alist
, without applying them.
Example:
(hack-connection-local-variables
'(:application tramp :protocol "ssh" :machine "localhost"))
connection-local-variables-alist
⇒ ((null-device . "/dev/null")
(shell-login-switch . "-l")
(shell-interactive-switch . "-i")
(shell-command-switch . "-c")
(shell-file-name . "/bin/bash"))
- Function: hack-connection-local-variables-apply criteria ¶
This function looks for connection-local variables according to
criteria, and immediately applies them in the current buffer.
- Macro: with-connection-local-application-variables application &rest body ¶
Apply all connection-local variables for application
, which are
specified by default-directory
.
After that, body is executed, and the connection-local variables
are unwound. Example:
(connection-local-set-profile-variables
'my-remote-perl
'((perl-command-name . "/usr/local/bin/perl5")
(perl-command-switch . "-e %s")))
(connection-local-set-profiles
'(:application my-app :protocol "ssh" :machine "remotehost")
'my-remote-perl)
(let ((default-directory "/ssh:remotehost:/working/dir/"))
(with-connection-local-application-variables 'my-app
do something useful))
- Variable: connection-local-default-application ¶
The default application, a symbol, to be applied in
with-connection-local-variables
. It defaults to tramp
,
but you can let-bind it to change the application temporarily
(see Local Variables).
This variable must not be changed globally.
- Macro: with-connection-local-variables &rest body ¶
This is equivalent to
with-connection-local-application-variables
, but uses
connection-local-default-application
for the application.
- Macro: setq-connection-local [symbol form]… ¶
This macro sets each symbol connection-locally to the result of
evaluating the corresponding form, using the connection-local
profile specified in connection-local-profile-name-for-setq
; if
the profile name is nil
, this macro will just set the variables
normally, as with setq
(see Setting Variable Values).
For example, you can use this macro in combination with
with-connection-local-variables
or
with-connection-local-application-variables
to lazily
initialize connection-local settings:
(defvar my-app-variable nil)
(connection-local-set-profile-variables
'my-app-connection-default-profile
'((my-app-variable . nil)))
(connection-local-set-profiles
'(:application my-app)
'my-app-connection-default-profile)
(defun my-app-get-variable ()
(with-connection-local-application-variables 'my-app
(or my-app-variable
(setq-connection-local my-app-variable
do something useful))))
- Variable: connection-local-profile-name-for-setq ¶
The connection-local profile name, a symbol, to use when setting
variables via setq-connection-local
. This is let-bound in the
body of with-connection-local-variables
, but you can also
let-bind it yourself if you’d like to set variables on a different
profile.
This variable must not be changed globally.
- Variable: enable-connection-local-variables ¶
If nil
, connection-local variables are ignored. This variable
shall be changed temporarily only in special modes.
12.15 Variable Aliases
It is sometimes useful to make two variables synonyms, so that both
variables always have the same value, and changing either one also
changes the other. Whenever you change the name of a
variable—either because you realize its old name was not well
chosen, or because its meaning has partly changed—it can be useful
to keep the old name as an alias of the new one for
compatibility. You can do this with defvaralias
.
- Function: defvaralias new-alias base-variable &optional docstring ¶
This function defines the symbol new-alias as a variable alias
for symbol base-variable. This means that retrieving the value
of new-alias returns the value of base-variable, and
changing the value of new-alias changes the value of
base-variable. The two aliased variable names always share the
same value and the same bindings.
If the docstring argument is non-nil
, it specifies the
documentation for new-alias; otherwise, the alias gets the same
documentation as base-variable has, if any, unless
base-variable is itself an alias, in which case new-alias gets
the documentation of the variable at the end of the chain of aliases.
This function returns base-variable.
Variable aliases are convenient for replacing an old name for a
variable with a new name. make-obsolete-variable
declares that
the old name is obsolete and therefore that it may be removed at some
stage in the future.
- Function: make-obsolete-variable obsolete-name current-name when &optional access-type ¶
This function makes the byte compiler warn that the variable
obsolete-name is obsolete. If current-name is a symbol,
it is the variable’s new name; then the warning message says to use
current-name instead of obsolete-name. If
current-name is a string, this is the message and there is no
replacement variable. when should be a string indicating when
the variable was first made obsolete (usually a version number
string).
The optional argument access-type, if non-nil
, should
specify the kind of access that will trigger obsolescence warnings; it
can be either get
or set
.
You can make two variables synonyms and declare one obsolete at the
same time using the macro define-obsolete-variable-alias
.
- Macro: define-obsolete-variable-alias obsolete-name current-name when &optional docstring ¶
This macro marks the variable obsolete-name as obsolete and also
makes it an alias for the variable current-name. It is
equivalent to the following:
(defvaralias obsolete-name current-name docstring)
(make-obsolete-variable obsolete-name current-name when)
This macro evaluates all its parameters, and both obsolete-name
and current-name should be symbols, so a typical usage would
look like:
(define-obsolete-variable-alias 'foo-thing 'bar-thing "27.1")
- Function: indirect-variable variable ¶
This function returns the variable at the end of the chain of aliases
of variable. If variable is not a symbol, or if variable is
not defined as an alias, the function returns variable.
This function signals a cyclic-variable-indirection
error if
there is a loop in the chain of symbols.
(defvaralias 'foo 'bar)
(indirect-variable 'foo)
⇒ bar
(indirect-variable 'bar)
⇒ bar
(setq bar 2)
bar
⇒ 2
foo
⇒ 2
(setq foo 0)
bar
⇒ 0
foo
⇒ 0
12.16 Variables with Restricted Values
Ordinary Lisp variables can be assigned any value that is a valid
Lisp object. However, certain Lisp variables are not defined in Lisp,
but in C. Most of these variables are defined in the C code using
DEFVAR_LISP
. Like variables defined in Lisp, these can take on
any value. However, some variables are defined using
DEFVAR_INT
or DEFVAR_BOOL
. See Writing Emacs Primitives, in particular the
description of functions of the type syms_of_filename
,
for a brief discussion of the C implementation.
Variables of type DEFVAR_BOOL
can only take on the values
nil
or t
. Attempting to assign them any other value
will set them to t
:
(let ((display-hourglass 5))
display-hourglass)
⇒ t
- Variable: byte-boolean-vars ¶
This variable holds a list of all variables of type DEFVAR_BOOL
.
Variables of type DEFVAR_INT
can take on only integer values.
Attempting to assign them any other value will result in an error:
(setq undo-limit 1000.0)
error→ Wrong type argument: integerp, 1000.0
12.17 Generalized Variables
A generalized variable or place form is one of the many
places in Lisp memory where values can be stored using the setf
macro (see The setf
Macro). The simplest place
form is a regular Lisp variable. But the CARs and CDRs of
lists, elements of arrays, properties of symbols, and many other
locations are also places where Lisp values get stored.
Generalized variables are analogous to lvalues in the C
language, where ‘x = a[i]’ gets an element from an array
and ‘a[i] = x’ stores an element using the same notation.
Just as certain forms like a[i]
can be lvalues in C, there
is a set of forms that can be generalized variables in Lisp.
12.17.1 The setf
Macro
The setf
macro is the most basic way to operate on generalized
variables. The setf
form is like setq
, except that it
accepts arbitrary place forms in the first (left) argument of each
pair rather than just symbols. For example, (setf (car a) b)
sets the car of a
to b
, doing the same operation as
(setcar a b)
, but without you having to use two separate
functions for setting and accessing this type of place.
- Macro: setf [place form]… ¶
This macro evaluates form and stores its value in place,
which must be a valid generalized variable form. If there are several
place and form pairs, the assignments are done sequentially
just as with setq
. setf
returns the value of the last
form.
The following Lisp forms are the forms in Emacs that will work as
generalized variables, and so may appear in the place argument
of setf
:
- A symbol. In other words,
(setf x y)
is exactly equivalent to
(setq x y)
, and setq
itself is strictly speaking
redundant given that setf
exists. Most programmers will
continue to prefer setq
for setting simple variables, though,
for stylistic and historical reasons. The macro (setf x y)
actually expands to (setq x y)
, so there is no performance
penalty for using it in compiled code.
- A call to any of the following standard Lisp functions:
aref cddr symbol-function
car elt symbol-plist
caar get symbol-value
cadr gethash
cdr nth
cdar nthcdr
- A call to any of the following Emacs-specific functions:
alist-get overlay-start
default-value overlay-get
face-background process-buffer
face-font p