Next: Variable Scoping, Previous: Accessing Variables, Up: Variables [Contents][Index]

### 11.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)

Next: Variable Scoping, Previous: Accessing Variables, Up: Variables [Contents][Index]