Previous: Setting Generalized Variables, Up: Generalized Variables
setf formsThis section describes how to define new forms that setf can
operate on.
This macro enables you to easily define
setfmethods for simple cases. name is the name of a function, macro, or special form. You can use this macro whenever name has a directly corresponding setter function that updates it, e.g.,(gv-define-simple-setter car setcar).This macro translates a call of the form
(setf (name args...) value)into
(setter args... value)Such a
setfcall is documented to return value. This is no problem with, e.g.,carandsetcar, becausesetcarreturns the value that it set. If your setter function does not return value, use a non-nilvalue for the fix-return argument ofgv-define-simple-setter. This expands into something equivalent to(let ((temp value)) (setter args... temp) temp)so ensuring that it returns the correct result.
This macro allows for more complex
setfexpansions than the previous form. You may need to use this form, for example, if there is no simple setter function to call, or if there is one but it requires different arguments to the place form.This macro expands the form
(setf (name args...)value)by first binding thesetfargument forms(value args...)according to arglist, and then executing body. body should return a Lisp form that does the assignment, and finally returns the value that was set. An example of using this macro is:(gv-define-setter caar (val x) `(setcar (car ,x) ,val))
For more control over the expansion, see the macro gv-define-expander.
The macro gv-letplace can be useful in defining macros that
perform similarly to setf; for example, the incf macro
of Common Lisp. Consult the source file gv.el for more details.
Common Lisp note: Common Lisp defines another way to specify thesetfbehavior of a function, namelysetffunctions, whose names are lists(setfname)rather than symbols. For example,(defun (setf foo) ...)defines the function that is used whensetfis applied tofoo. Emacs does not support this. It is a compile-time error to usesetfon a form that has not already had an appropriate expansion defined. In Common Lisp, this is not an error since the function(setffunc)might be defined later.