# 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`setsymbol 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)``