Provide generalized variables in core Elisp.
* lisp/emacs-lisp/gv.el: New file. * lisp/subr.el (push, pop): Extend to generalized variables. * lisp/loadup.el (macroexp): Unload if preloaded and uncompiled. * lisp/emacs-lisp/cl-lib.el (cl-pop, cl-push, cl--set-nthcdr): Remove. * lisp/emacs-lisp/cl-macs.el: Require gv. Use gv-define-setter, gv-define-simple-setter, and gv-define-expander. Remove setf-methods defined in gv. Rename cl-setf -> setf. (cl-setf, cl-do-pop, cl-get-setf-method): Remove. (cl-letf, cl-letf*, cl-define-modify-macro, cl-defsetf) (cl-define-setf-expander, cl-struct-setf-expander): Move to cl.el. (cl-remf, cl-shiftf, cl-rotatef, cl-callf, cl-callf2): Rewrite with gv-letplace. (cl-defstruct): Don't define setf-method any more. * lisp/emacs-lisp/cl.el (flet): Don't autoload. (cl--letf, letf, cl--letf*, letf*, cl--gv-adapt) (define-setf-expander, defsetf, define-modify-macro) (cl-struct-setf-expander): Move from cl-lib.el. * lisp/emacs-lisp/syntax.el: * lisp/emacs-lisp/ewoc.el: * lisp/emacs-lisp/smie.el: * lisp/emacs-lisp/cconv.el: * lisp/emacs-lisp/timer.el: Rename cl-setf -> setf, cl-push -> push. (timer--time): Use gv-define-simple-setter. * lisp/emacs-lisp/macroexp.el (macroexp-let2): Rename from macroexp-let² to avoid coding-system problems in subr.el. Adjust all users. (macroexp--maxsize, macroexp-small-p): New functions. * lisp/emacs-lisp/bytecomp.el (byte-compile-file): Don't use cl-letf. * lisp/scroll-bar.el (scroll-bar-mode): * lisp/simple.el (auto-fill-mode, overwrite-mode, binary-overwrite-mode) (normal-erase-is-backspace-mode): Don't use the `eq' place. * lisp/winner.el (winner-configuration, winner-make-point-alist) (winner-set-conf, winner-get-point, winner-set): Don't abuse letf. * lisp/files.el (locate-file-completion-table): Avoid list*. Fixes: debbugs:11657
This commit is contained in:
parent
575db3f1a8
commit
2ee3d7f0aa
23 changed files with 2043 additions and 1972 deletions
|
@ -11,7 +11,7 @@
|
|||
;;;;;; cl--set-frame-visible-p cl--map-overlays cl--map-intervals
|
||||
;;;;;; cl--map-keymap-recursively cl-notevery cl-notany cl-every
|
||||
;;;;;; cl-some cl-mapcon cl-mapcan cl-mapl cl-maplist cl-map cl--mapcar-many
|
||||
;;;;;; cl-equalp cl-coerce) "cl-extra" "cl-extra.el" "1f486111e93d119ceb6e95c434e3fd4b")
|
||||
;;;;;; cl-equalp cl-coerce) "cl-extra" "cl-extra.el" "edc8a08741d81c74be36b27664d3555a")
|
||||
;;; Generated autoloads from cl-extra.el
|
||||
|
||||
(autoload 'cl-coerce "cl-extra" "\
|
||||
|
@ -257,17 +257,15 @@ Remove from SYMBOL's plist the property PROPNAME and its value.
|
|||
;;;### (autoloads (cl--compiler-macro-cXXr cl--compiler-macro-list*
|
||||
;;;;;; cl--compiler-macro-adjoin cl-defsubst cl-compiler-macroexpand
|
||||
;;;;;; cl-define-compiler-macro cl-assert cl-check-type cl-typep
|
||||
;;;;;; cl-deftype cl-struct-setf-expander cl-defstruct cl-define-modify-macro
|
||||
;;;;;; cl-callf2 cl-callf cl-letf* cl-letf cl-rotatef cl-shiftf
|
||||
;;;;;; cl-remf cl-do-pop cl-psetf cl-setf cl-get-setf-method cl-defsetf
|
||||
;;;;;; cl-define-setf-expander cl-declare cl-the cl-locally cl-multiple-value-setq
|
||||
;;;;;; cl-deftype cl-defstruct cl-callf2 cl-callf cl-rotatef cl-shiftf
|
||||
;;;;;; cl-remf cl-psetf cl-declare cl-the cl-locally cl-multiple-value-setq
|
||||
;;;;;; cl-multiple-value-bind cl-symbol-macrolet cl-macrolet cl-labels
|
||||
;;;;;; cl-flet cl-progv cl-psetq cl-do-all-symbols cl-do-symbols
|
||||
;;;;;; cl-dotimes cl-dolist cl-do* cl-do cl-loop cl-return-from
|
||||
;;;;;; cl-return cl-block cl-etypecase cl-typecase cl-ecase cl-case
|
||||
;;;;;; cl-load-time-value cl-eval-when cl-destructuring-bind cl-function
|
||||
;;;;;; cl-defmacro cl-defun cl-gentemp cl-gensym) "cl-macs" "cl-macs.el"
|
||||
;;;;;; "57801d8e4d72553371d59eca7b44292f")
|
||||
;;;;;; "e37cb1001378ce1d677b67760fb6994b")
|
||||
;;; Generated autoloads from cl-macs.el
|
||||
|
||||
(autoload 'cl-gensym "cl-macs" "\
|
||||
|
@ -513,7 +511,7 @@ This is like `cl-flet', but for macros instead of functions.
|
|||
(autoload 'cl-symbol-macrolet "cl-macs" "\
|
||||
Make symbol macro definitions.
|
||||
Within the body FORMs, references to the variable NAME will be replaced
|
||||
by EXPANSION, and (setq NAME ...) will act like (cl-setf EXPANSION ...).
|
||||
by EXPANSION, and (setq NAME ...) will act like (setf EXPANSION ...).
|
||||
|
||||
\(fn ((NAME EXPANSION) ...) FORM...)" nil t)
|
||||
|
||||
|
@ -565,69 +563,16 @@ See Info node `(cl)Declarations' for details.
|
|||
|
||||
\(fn &rest SPECS)" nil t)
|
||||
|
||||
(autoload 'cl-define-setf-expander "cl-macs" "\
|
||||
Define a `cl-setf' method.
|
||||
This method shows how to handle `cl-setf's to places of the form (NAME ARGS...).
|
||||
The argument forms ARGS are bound according to ARGLIST, as if NAME were
|
||||
going to be expanded as a macro, then the BODY forms are executed and must
|
||||
return a list of five elements: a temporary-variables list, a value-forms
|
||||
list, a store-variables list (of length one), a store-form, and an access-
|
||||
form. See `cl-defsetf' for a simpler way to define most setf-methods.
|
||||
|
||||
\(fn NAME ARGLIST BODY...)" nil t)
|
||||
|
||||
(autoload 'cl-defsetf "cl-macs" "\
|
||||
Define a `cl-setf' method.
|
||||
This macro is an easy-to-use substitute for `cl-define-setf-expander' that works
|
||||
well for simple place forms. In the simple `cl-defsetf' form, `cl-setf's of
|
||||
the form (cl-setf (NAME ARGS...) VAL) are transformed to function or macro
|
||||
calls of the form (FUNC ARGS... VAL). Example:
|
||||
|
||||
(cl-defsetf aref aset)
|
||||
|
||||
Alternate form: (cl-defsetf NAME ARGLIST (STORE) BODY...).
|
||||
Here, the above `cl-setf' call is expanded by binding the argument forms ARGS
|
||||
according to ARGLIST, binding the value form VAL to STORE, then executing
|
||||
BODY, which must return a Lisp form that does the necessary `cl-setf' operation.
|
||||
Actually, ARGLIST and STORE may be bound to temporary variables which are
|
||||
introduced automatically to preserve proper execution order of the arguments.
|
||||
Example:
|
||||
|
||||
(cl-defsetf nth (n x) (v) `(setcar (nthcdr ,n ,x) ,v))
|
||||
|
||||
\(fn NAME [FUNC | ARGLIST (STORE) BODY...])" nil t)
|
||||
|
||||
(autoload 'cl-get-setf-method "cl-macs" "\
|
||||
Return a list of five values describing the setf-method for PLACE.
|
||||
PLACE may be any Lisp form which can appear as the PLACE argument to
|
||||
a macro like `cl-setf' or `cl-incf'.
|
||||
|
||||
\(fn PLACE &optional ENV)" nil nil)
|
||||
|
||||
(autoload 'cl-setf "cl-macs" "\
|
||||
Set each PLACE to the value of its VAL.
|
||||
This is a generalized version of `setq'; the PLACEs may be symbolic
|
||||
references such as (car x) or (aref x i), as well as plain symbols.
|
||||
For example, (cl-setf (cl-cadar x) y) is equivalent to (setcar (cdar x) y).
|
||||
The return value is the last VAL in the list.
|
||||
|
||||
\(fn PLACE VAL PLACE VAL ...)" nil t)
|
||||
|
||||
(autoload 'cl-psetf "cl-macs" "\
|
||||
Set PLACEs to the values VALs in parallel.
|
||||
This is like `cl-setf', except that all VAL forms are evaluated (in order)
|
||||
This is like `setf', except that all VAL forms are evaluated (in order)
|
||||
before assigning any PLACEs to the corresponding values.
|
||||
|
||||
\(fn PLACE VAL PLACE VAL ...)" nil t)
|
||||
|
||||
(autoload 'cl-do-pop "cl-macs" "\
|
||||
|
||||
|
||||
\(fn PLACE)" nil nil)
|
||||
|
||||
(autoload 'cl-remf "cl-macs" "\
|
||||
Remove TAG from property list PLACE.
|
||||
PLACE may be a symbol, or any generalized variable allowed by `cl-setf'.
|
||||
PLACE may be a symbol, or any generalized variable allowed by `setf'.
|
||||
The form returns true if TAG was found and removed, nil otherwise.
|
||||
|
||||
\(fn PLACE TAG)" nil t)
|
||||
|
@ -635,51 +580,23 @@ The form returns true if TAG was found and removed, nil otherwise.
|
|||
(autoload 'cl-shiftf "cl-macs" "\
|
||||
Shift left among PLACEs.
|
||||
Example: (cl-shiftf A B C) sets A to B, B to C, and returns the old A.
|
||||
Each PLACE may be a symbol, or any generalized variable allowed by `cl-setf'.
|
||||
Each PLACE may be a symbol, or any generalized variable allowed by `setf'.
|
||||
|
||||
\(fn PLACE... VAL)" nil t)
|
||||
|
||||
(autoload 'cl-rotatef "cl-macs" "\
|
||||
Rotate left among PLACEs.
|
||||
Example: (cl-rotatef A B C) sets A to B, B to C, and C to A. It returns nil.
|
||||
Each PLACE may be a symbol, or any generalized variable allowed by `cl-setf'.
|
||||
Each PLACE may be a symbol, or any generalized variable allowed by `setf'.
|
||||
|
||||
\(fn PLACE...)" nil t)
|
||||
|
||||
(autoload 'cl-letf "cl-macs" "\
|
||||
Temporarily bind to PLACEs.
|
||||
This is the analogue of `let', but with generalized variables (in the
|
||||
sense of `cl-setf') for the PLACEs. Each PLACE is set to the corresponding
|
||||
VALUE, then the BODY forms are executed. On exit, either normally or
|
||||
because of a `throw' or error, the PLACEs are set back to their original
|
||||
values. Note that this macro is *not* available in Common Lisp.
|
||||
As a special case, if `(PLACE)' is used instead of `(PLACE VALUE)',
|
||||
the PLACE is not modified before executing BODY.
|
||||
|
||||
\(fn ((PLACE VALUE) ...) BODY...)" nil t)
|
||||
|
||||
(put 'cl-letf 'lisp-indent-function '1)
|
||||
|
||||
(autoload 'cl-letf* "cl-macs" "\
|
||||
Temporarily bind to PLACEs.
|
||||
This is the analogue of `let*', but with generalized variables (in the
|
||||
sense of `cl-setf') for the PLACEs. Each PLACE is set to the corresponding
|
||||
VALUE, then the BODY forms are executed. On exit, either normally or
|
||||
because of a `throw' or error, the PLACEs are set back to their original
|
||||
values. Note that this macro is *not* available in Common Lisp.
|
||||
As a special case, if `(PLACE)' is used instead of `(PLACE VALUE)',
|
||||
the PLACE is not modified before executing BODY.
|
||||
|
||||
\(fn ((PLACE VALUE) ...) BODY...)" nil t)
|
||||
|
||||
(put 'cl-letf* 'lisp-indent-function '1)
|
||||
|
||||
(autoload 'cl-callf "cl-macs" "\
|
||||
Set PLACE to (FUNC PLACE ARGS...).
|
||||
FUNC should be an unquoted function name. PLACE may be a symbol,
|
||||
or any generalized variable allowed by `cl-setf'.
|
||||
or any generalized variable allowed by `setf'.
|
||||
|
||||
\(fn FUNC PLACE ARGS...)" nil t)
|
||||
\(fn FUNC PLACE &rest ARGS)" nil t)
|
||||
|
||||
(put 'cl-callf 'lisp-indent-function '2)
|
||||
|
||||
|
@ -691,19 +608,12 @@ Like `cl-callf', but PLACE is the second argument of FUNC, not the first.
|
|||
|
||||
(put 'cl-callf2 'lisp-indent-function '3)
|
||||
|
||||
(autoload 'cl-define-modify-macro "cl-macs" "\
|
||||
Define a `cl-setf'-like modify macro.
|
||||
If NAME is called, it combines its PLACE argument with the other arguments
|
||||
from ARGLIST using FUNC: (cl-define-modify-macro cl-incf (&optional (n 1)) +)
|
||||
|
||||
\(fn NAME ARGLIST FUNC &optional DOC)" nil t)
|
||||
|
||||
(autoload 'cl-defstruct "cl-macs" "\
|
||||
Define a struct type.
|
||||
This macro defines a new data type called NAME that stores data
|
||||
in SLOTs. It defines a `make-NAME' constructor, a `copy-NAME'
|
||||
copier, a `NAME-p' predicate, and slot accessors named `NAME-SLOT'.
|
||||
You can use the accessors to set the corresponding slots, via `cl-setf'.
|
||||
You can use the accessors to set the corresponding slots, via `setf'.
|
||||
|
||||
NAME may instead take the form (NAME OPTIONS...), where each
|
||||
OPTION is either a single keyword or (KEYWORD VALUE).
|
||||
|
@ -712,17 +622,12 @@ See Info node `(cl)Structures' for a list of valid keywords.
|
|||
Each SLOT may instead take the form (SLOT SLOT-OPTS...), where
|
||||
SLOT-OPTS are keyword-value pairs for that slot. Currently, only
|
||||
one keyword is supported, `:read-only'. If this has a non-nil
|
||||
value, that slot cannot be set via `cl-setf'.
|
||||
value, that slot cannot be set via `setf'.
|
||||
|
||||
\(fn NAME SLOTS...)" nil t)
|
||||
|
||||
(put 'cl-defstruct 'doc-string-elt '2)
|
||||
|
||||
(autoload 'cl-struct-setf-expander "cl-macs" "\
|
||||
|
||||
|
||||
\(fn X NAME ACCESSOR PRED-FORM POS)" nil nil)
|
||||
|
||||
(autoload 'cl-deftype "cl-macs" "\
|
||||
Define NAME as a new data type.
|
||||
The type name can then be used in `cl-typecase', `cl-check-type', etc.
|
||||
|
@ -779,6 +684,8 @@ surrounded by (cl-block NAME ...).
|
|||
|
||||
\(fn NAME ARGLIST [DOCSTRING] BODY...)" nil t)
|
||||
|
||||
(put 'cl-defsubst 'lisp-indent-function '2)
|
||||
|
||||
(autoload 'cl--compiler-macro-adjoin "cl-macs" "\
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue