aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorStefan Monnier2015-01-18 14:08:13 -0500
committerStefan Monnier2015-01-18 14:08:13 -0500
commit1f545d33648f819e8eedb92bafe19b53670eaf91 (patch)
treea3b44fa8b6616c1b53bae657b68abd0fff12d10a /lisp
parent2a61bd0096db23123734db439051c859e42b9606 (diff)
downloademacs-1f545d33648f819e8eedb92bafe19b53670eaf91.tar.gz
emacs-1f545d33648f819e8eedb92bafe19b53670eaf91.zip
* lisp/emacs-lisp/eieio-core.el: Add `subclass' specializer for cl-generic.
(eieio--generic-subclass-tagcode, eieio--generic-subclass-tag-types): New functions. (cl-generic-tagcode-function, cl-generic-tag-types-function): Use them. * test/automated/eieio-test-methodinvoke.el (eieio-test-cl-generic-1): Test `subclass' specializer.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog9
-rw-r--r--lisp/emacs-lisp/eieio-core.el25
2 files changed, 32 insertions, 2 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index c731551f913..ab4428382fe 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,5 +1,10 @@
12015-01-18 Stefan Monnier <monnier@iro.umontreal.ca> 12015-01-18 Stefan Monnier <monnier@iro.umontreal.ca>
2 2
3 * emacs-lisp/eieio-core.el: Add `subclass' specializer for cl-generic.
4 (eieio--generic-subclass-tagcode, eieio--generic-subclass-tag-types):
5 New functions.
6 (cl-generic-tagcode-function, cl-generic-tag-types-function): Use them.
7
3 * emacs-lisp/eieio.el (defclass): Add obsolescence warning for the 8 * emacs-lisp/eieio.el (defclass): Add obsolescence warning for the
4 `newname' argument. 9 `newname' argument.
5 10
@@ -152,8 +157,8 @@
1522015-01-16 Artur Malabarba <bruce.connor.am@gmail.com> 1572015-01-16 Artur Malabarba <bruce.connor.am@gmail.com>
153 158
154 * emacs-lisp/package.el (package--read-pkg-desc): 159 * emacs-lisp/package.el (package--read-pkg-desc):
155 New function. Read a `define-package' form in current buffer. Return 160 New function. Read a `define-package' form in current buffer.
156 the pkg-desc, with desc-kind set to KIND. 161 Return the pkg-desc, with desc-kind set to KIND.
157 (package-dir-info): New function. Find package information for a 162 (package-dir-info): New function. Find package information for a
158 directory. The return result is a `package-desc'. 163 directory. The return result is a `package-desc'.
159 (package-install-from-buffer): Install packages from dired buffer. 164 (package-install-from-buffer): Install packages from dired buffer.
diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el
index a82e887fa0c..e4221e48fe2 100644
--- a/lisp/emacs-lisp/eieio-core.el
+++ b/lisp/emacs-lisp/eieio-core.el
@@ -1227,6 +1227,8 @@ method invocation orders of the involved classes."
1227 1227
1228(require 'cl-generic) 1228(require 'cl-generic)
1229 1229
1230;;;; General support to dispatch based on the type of the argument.
1231
1230(add-function :before-until cl-generic-tagcode-function 1232(add-function :before-until cl-generic-tagcode-function
1231 #'eieio--generic-tagcode) 1233 #'eieio--generic-tagcode)
1232(defun eieio--generic-tagcode (type name) 1234(defun eieio--generic-tagcode (type name)
@@ -1246,6 +1248,29 @@ method invocation orders of the involved classes."
1246 (mapcar #'eieio--class-symbol 1248 (mapcar #'eieio--class-symbol
1247 (eieio--class-precedence-list (symbol-value tag))))) 1249 (eieio--class-precedence-list (symbol-value tag)))))
1248 1250
1251;;;; Dispatch for arguments which are classes.
1252
1253;; Since EIEIO does not support metaclasses, users can't easily use the
1254;; "dispatch on argument type" for class arguments. That's why EIEIO's
1255;; `defmethod' added the :static qualifier. For cl-generic, such a qualifier
1256;; would not make much sense (e.g. to which argument should it apply?).
1257;; Instead, we add a new "subclass" specializer.
1258
1259(add-function :before-until cl-generic-tagcode-function
1260 #'eieio--generic-subclass-tagcode)
1261(defun eieio--generic-subclass-tagcode (type name)
1262 (when (eq 'subclass (car-safe type))
1263 `(60 . (and (symbolp ,name) (eieio--class-v ,name)))))
1264
1265(add-function :before-until cl-generic-tag-types-function
1266 #'eieio--generic-subclass-tag-types)
1267(defun eieio--generic-subclass-tag-types (tag)
1268 (when (eieio--class-p tag)
1269 (mapcar (lambda (class)
1270 `(subclass
1271 ,(if (symbolp class) class (eieio--class-symbol class))))
1272 (eieio--class-precedence-list tag))))
1273
1249;;; Backward compatibility functions 1274;;; Backward compatibility functions
1250;; To support .elc files compiled for older versions of EIEIO. 1275;; To support .elc files compiled for older versions of EIEIO.
1251 1276