Next: Adding Generalized Variables, Up: Generalized Variables [Contents][Index]
setf
MacroThe setf
macro is the most basic way to operate on generalized
variables. The setf
form is like setq
, except that it
accepts arbitrary place forms on the left side rather than just
symbols. For example, (setf (car a) b)
sets the car of
a
to b
, doing the same operation as (setcar a b)
,
but without having to remember two separate functions for setting and
accessing every type of place.
This macro evaluates form and stores it in place, which
must be a valid generalized variable form. If there are several
place and form pairs, the assignments are done sequentially
just as with setq
. setf
returns the value of the last
form.
The following Lisp forms will work as generalized variables, and
so may appear in the place argument of setf
:
(setf x y)
is
exactly equivalent to (setq x y)
, and setq
itself is
strictly speaking redundant given that setf
exists. Many
programmers continue to prefer setq
for setting simple
variables, though, purely for stylistic or historical reasons.
The macro (setf x y)
actually expands to (setq x y)
,
so there is no performance penalty for using it in compiled code.
aref cddr symbol-function car elt symbol-plist caar get symbol-value cadr gethash cdr nth cdar nthcdr
default-value process-get frame-parameter process-sentinel terminal-parameter window-buffer keymap-parent window-display-table match-data window-dedicated-p overlay-get window-hscroll overlay-start window-parameter overlay-end window-point process-buffer window-start process-filter
setf
signals an error if you pass a place form that it
does not know how to handle.
Note that for nthcdr
, the list argument of the function must
itself be a valid place form. For example, (setf (nthcdr
0 foo) 7)
will set foo
itself to 7.
The macros push
(see List Variables) and pop
(see List Elements) can manipulate generalized variables,
not just lists. (pop place)
removes and returns the first
element of the list stored in place. It is analogous to
(prog1 (car place) (setf place (cdr place)))
,
except that it takes care to evaluate all subforms only once.
(push x place)
inserts x at the front of
the list stored in place. It is analogous to (setf
place (cons x place))
, except for evaluation of the
subforms. Note that push
and pop
on an nthcdr
place can be used to insert or delete at any position in a list.
The cl-lib library defines various extensions for generalized
variables, including additional setf
places.
See Generalized Variables in Common Lisp Extensions.
Next: Adding Generalized Variables, Up: Generalized Variables [Contents][Index]