Next: Variable Scoping, Previous: Accessing Variables, Up: Variables
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
.
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 most-local existing 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’ insetq
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 ofx
is set. x) => 6 x ; The global value is unchanged. => 3Note 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 thatx
is set before y (1+ x)) ; the value ofy
is computed. => 11
This function sets symbol's value to value, then returns value. Since
set
is a function, the expression written for symbol is evaluated to obtain the symbol to set.The most-local existing binding of the variable is the binding that is set; shadowed bindings are not affected.
(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 symbolone
. => 2 one ; So it isone
that was set. => 2 (let ((one 1)) ; This binding ofone
is set, (set 'one 3) ; not the global value. one) => 3 one => 2If symbol is not actually a symbol, a
wrong-type-argument
error is signaled.(set '(x y) 'z) error--> Wrong type argument: symbolp, (x y)Logically speaking,
set
is a more fundamental primitive thansetq
. Any use ofsetq
can be trivially rewritten to useset
;setq
could even be defined as a macro, given the availability ofset
. However,set
itself is rarely used; beginners hardly need to know about it. It is useful only for choosing at run time which variable to set. For example, the commandset-variable
, which reads a variable name from the user and then sets the variable, needs to useset
.Common Lisp note: In Common Lisp,set
always changes the symbol's “special” or dynamic value, ignoring any lexical bindings. In Emacs Lisp, all variables and all bindings are dynamic, soset
always affects the most local existing binding.
One other function for setting a variable is designed to add an element to a list if it is not already present in the list.
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.
The argument symbol is not implicitly quoted;
add-to-list
is an ordinary function, likeset
and unlikesetq
. Quote the argument yourself if that is what you want.
Here's a scenario showing how to use add-to-list
:
(setq foo '(a b)) => (a b) (add-to-list 'foo 'c) ;; Addc
. => (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:
(or (member value var) (setq var (cons value var)))