summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2017-12-25 22:51:23 -0500
committerStefan Monnier <monnier@iro.umontreal.ca>2017-12-25 22:51:23 -0500
commitcd1d9e79f74f137511d49eb9b0ae7ba750ba6c3c (patch)
tree5b67f435a66fc5fceae33b73b1e83d410f555930 /lisp/emacs-lisp
parentcf13450db84d507ef1d5d32e56345ecf0bd5c592 (diff)
downloademacs-cd1d9e79f74f137511d49eb9b0ae7ba750ba6c3c.tar.gz
emacs-cd1d9e79f74f137511d49eb9b0ae7ba750ba6c3c.tar.bz2
emacs-cd1d9e79f74f137511d49eb9b0ae7ba750ba6c3c.zip
* lisp/register.el: Use cl-generic
(registerv): Make it a "normal"struct. (registerv-make): Declare obsolete. (register-val-jump-to, register-val-describe, register-val-insert): New generic functions. (jump-to-register, describe-register-1, insert-register): Use them. * lisp/emacs-lisp/cl-generic.el: Prefill a combination of struct+typeof. (cl--generic-prefill-dispatchers): Allow a list of specializers.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r--lisp/emacs-lisp/cl-generic.el17
1 files changed, 11 insertions, 6 deletions
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index 00278996792..5c16f64a6f8 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -808,22 +808,26 @@ methods.")
;; able to preload cl-generic without also preloading the byte-compiler,
;; So we use `eval-when-compile' so as not keep it available longer than
;; strictly needed.
-(defmacro cl--generic-prefill-dispatchers (arg-or-context specializer)
+(defmacro cl--generic-prefill-dispatchers (arg-or-context &rest specializers)
(unless (integerp arg-or-context)
(setq arg-or-context `(&context . ,arg-or-context)))
(unless (fboundp 'cl--generic-get-dispatcher)
(require 'cl-generic))
(let ((fun (cl--generic-get-dispatcher
- `(,arg-or-context ,@(cl-generic-generalizers specializer)
- ,cl--generic-t-generalizer))))
+ `(,arg-or-context
+ ,@(apply #'append
+ (mapcar #'cl-generic-generalizers specializers))
+ ,cl--generic-t-generalizer))))
;; Recompute dispatch at run-time, since the generalizers may be slightly
;; different (e.g. byte-compiled rather than interpreted).
;; FIXME: There is a risk that the run-time generalizer is not equivalent
;; to the compile-time one, in which case `fun' may not be correct
;; any more!
- `(let ((dispatch `(,',arg-or-context
- ,@(cl-generic-generalizers ',specializer)
- ,cl--generic-t-generalizer)))
+ `(let ((dispatch
+ `(,',arg-or-context
+ ,@(apply #'append
+ (mapcar #'cl-generic-generalizers ',specializers))
+ ,cl--generic-t-generalizer)))
;; (message "Prefilling for %S with \n%S" dispatch ',fun)
(puthash dispatch ',fun cl--generic-dispatchers)))))
@@ -1205,6 +1209,7 @@ See the full list and their hierarchy in `cl--generic-typeof-types'."
(cl-call-next-method)))
(cl--generic-prefill-dispatchers 0 integer)
+(cl--generic-prefill-dispatchers 0 cl--generic-generalizer integer)
;;; Dispatch on major mode.