elisp: Setting Variables

 
 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.  SeeVariable
      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)