Next: Modify Macros, Up: Generalized Variables [Contents][Index]
Several standard (e.g., car
) and Emacs-specific
(e.g., window-point
) Lisp functions are setf
-able by default.
This package defines setf
handlers for several additional functions:
cl-rest cl-subseq cl-get cl-getf cl-caaar…cl-cddddr cl-first…cl-tenth
Note that for cl-getf
(as for nthcdr
), the list argument
of the function must itself be a valid place form.
buffer-file-name getenv buffer-modified-p global-key-binding buffer-name local-key-binding buffer-string mark buffer-substring mark-marker current-buffer marker-position current-case-table mouse-position current-column point current-global-map point-marker current-input-mode point-max current-local-map point-min current-window-configuration read-mouse-position default-file-modes screen-height documentation-property screen-width face-background selected-window face-background-pixmap selected-screen face-font selected-frame face-foreground standard-case-table face-underline-p syntax-table file-modes visited-file-modtime frame-height window-height frame-parameters window-width frame-visible-p x-get-secondary-selection frame-width x-get-selection get-register
Most of these have directly corresponding “set” functions, like
use-local-map
for current-local-map
, or goto-char
for point
. A few, like point-min
, expand to longer
sequences of code when they are used with setf
((narrow-to-region x (point-max))
in this case).
(substring subplace n [m])
,
where subplace is itself a valid generalized variable whose
current value is a string, and where the value stored is also a
string. The new string is spliced into the specified part of the
destination string. For example:
(setq a (list "hello" "world")) ⇒ ("hello" "world") (cadr a) ⇒ "world" (substring (cadr a) 2 4) ⇒ "rl" (setf (substring (cadr a) 2 4) "o") ⇒ "o" (cadr a) ⇒ "wood" a ⇒ ("hello" "wood")
The generalized variable buffer-substring
, listed above,
also works in this way by replacing a portion of the current buffer.
setf
is applied to the resulting form.
The setf
macro takes care to evaluate all subforms in
the proper left-to-right order; for example,
(setf (aref vec (cl-incf i)) i)
looks like it will evaluate (cl-incf i)
exactly once, before the
following access to i
; the setf
expander will insert
temporary variables as necessary to ensure that it does in fact work
this way no matter what setf-method is defined for aref
.
(In this case, aset
would be used and no such steps would
be necessary since aset
takes its arguments in a convenient
order.)
However, if the place form is a macro which explicitly evaluates its arguments in an unusual order, this unusual order will be preserved. Adapting an example from Steele, given
(defmacro wrong-order (x y) (list 'aref y x))
the form (setf (wrong-order a b) 17)
will
evaluate b first, then a, just as in an actual call
to wrong-order
.
Next: Modify Macros, Up: Generalized Variables [Contents][Index]