set
set Function
Syntax:
set symbol value → value
Arguments and Values:
symbol—a symbol.
value—an object.
Description:
set changes the contents of the value cell of symbol to the given value.
(set symbol value) ≡ (setf (symbol-value symbol) value)
Examples:
(setf (symbol-value ’n) 1) → 1
(set ’n 2) → 2
(symbol-value ’n) → 2
(let ((n 3))
(declare (special n))
(setq n (+ n 1))
(setf (symbol-value ’n) (\* n 10))
(set ’n (+ (symbol-value ’n) n))
n) → 80
n → 2
(let ((n 3))
(setq n (+ n 1))
(setf (symbol-value ’n) (\* n 10))
(set ’n (+ (symbol-value ’n) n))
n) → 4
n → 44
(defvar \*n\* 2)
(let ((\*n\* 3))
(setq \*n\* (+ \*n\* 1))
(setf (symbol-value ’\*n\*) (\* \*n\* 10))
(set ’\*n\* (+ (symbol-value ’\*n\*) \*n\*))
\*n\*) → 80
\*n\* → 2
(defvar \*even-count\* 0) → \*EVEN-COUNT\*
(defvar \*odd-count\* 0) → \*ODD-COUNT\*
(defun tally-list (list)
(dolist (element list)
(set (if (evenp element) ’\*even-count\* ’\*odd-count\*)
(+ element (if (evenp element) \*even-count\* \*odd-count\*)))))
(tally-list ’(1 9 4 3 2 7)) → NIL
\*even-count\* → 6
\*odd-count\* → 20
Side Effects:
The value of symbol is changed.
See Also:
setq, progv, symbol-value
Notes:
The function set is deprecated.
set cannot change the value of a lexical variable.
Expanded Reference: set
set is deprecated. Use (setf (symbol-value ...) ...) instead.
Basic usage
set changes the value cell of a symbol. It is equivalent to (setf (symbol-value symbol) value).
(set 'my-var 42)
(symbol-value 'my-var)
=> 42
set cannot change lexical variables
Like symbol-value, set only affects the dynamic (special) value of a symbol, not lexical bindings.
(set 'x 10)
(let ((x 20))
(set 'x 30)
(values x (symbol-value 'x)))
=> 20
=> 30
set with dynamic (special) variables
set works with dynamically bound variables as expected.
(defvar *setting* :initial)
(let ((*setting* :temporary))
(set '*setting* :modified)
*setting*)
=> :MODIFIED
*setting*
=> :INITIAL
Equivalence with setf of symbol-value
(set 'equiv-test 'via-set)
(symbol-value 'equiv-test)
=> VIA-SET
(setf (symbol-value 'equiv-test) 'via-setf)
(symbol-value 'equiv-test)
=> VIA-SETF
Using set with a computed symbol
One advantage of set over setq is that the symbol argument is evaluated, allowing dynamic dispatch.
(defvar *a* 0)
(defvar *b* 0)
(dolist (pair '((*a* 10) (*b* 20)))
(set (first pair) (second pair)))
(values *a* *b*)
=> 10
=> 20