Next: Variable Scoping Prev: Accessing Variables Up: Variables
How to Alter a Variable Value
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 most-local
existing binding of the symbol is changed.
The value of the `setq' form is the value of the last FORM.
(setq x (1+ 2))
x ; `x' now has a global value.
(let ((x 5))
(setq x 6) ; The local binding of `x' is set.
x ; The global value is unchanged.
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.
- Function: set SYMBOL VALUE
This function sets SYMBOL's value to VALUE, then returns VALUE.
Since `set' is a function, the expression written for SYMBOL is
evaluated to obtain the symbol to be set.
The most-local existing binding of the variable is the binding
that is set; shadowed bindings are not affected. If SYMBOL is not
actually a symbol, a `wrong-type-argument' error is signaled.
(set one 1)
error--> Symbol's value as variable is void: one
(set 'one 1)
(set 'two 'one)
(set two 2) ; `two' evaluates to symbol `one'.
one ; So it is `one' that was set.
(let ((one 1)) ; This binding of `one' is set,
(set 'one 3) ; not the global value.
Logically speaking, `set' is a more fundamental primitive that
`setq'. Any use of `setq' can be trivially rewritten to use
`set'; `setq' could even be defined as a macro, given the
availability of `set'. However, `set' itself is rarely used;
beginners hardly need to know about it. It is needed only when the
choice of variable to be set is made at run time. For example, the
command `set-variable', which reads a variable name from the user
and then sets the variable, needs to use `set'.
Common Lisp note: in Common Lisp, `set' always changes the
symbol's special value, ignoring any lexical bindings. In
Emacs Lisp, all variables and all bindings are special, so
`set' always affects the most local existing binding.
automatically generated by info2www