Next: Watching Variables, 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 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’ 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 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 assetq
, apart from the fact thatset
evaluates its symbol argument whereassetq
does not. But when a variable is lexically bound,set
affects its dynamic value, whereassetq
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 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)