Skip to main content

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

warning

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