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 Variable Scoping.
(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)