OClosure: Add support for defmethod dispatch

* lisp/emacs-lisp/oclosure.el (oclosure--class): Add slot `allparents`.
(oclosure--class-make): Add corresponding arg `allparents`.
(oclosure, oclosure--build-class): Pass the new arg to the constructor.
(oclosure--define): Make the predicate function understand subtyping.

* lisp/emacs-lisp/cl-preloaded.el (cl--class-allparents): Move from
`cl-generic.el`.

* lisp/emacs-lisp/cl-generic.el (cl--generic-class-parents): Move to
`cl-preloaded.el` and rename to `cl--class-allparents`.
Adjust all callers.
(cl--generic-oclosure-tag, cl-generic--oclosure-specializers): New functions.
(cl-generic-generalizers) <oclosure-struct>: New generalizer.

* test/lisp/emacs-lisp/oclosure-tests.el (oclosure-test-gen):
New generic function.
(oclosure-test): Add test for dispatch on oclosure types.
This commit is contained in:
Stefan Monnier 2022-04-01 08:54:55 -04:00
parent 611179d000
commit ff067408e4
4 changed files with 73 additions and 18 deletions

View file

@ -29,6 +29,16 @@
"Simple OClosure."
fst snd name)
(cl-defmethod oclosure-test-gen ((_x compiled-function)) "#<bytecode>")
(cl-defmethod oclosure-test-gen ((_x cons)) "#<cons>")
(cl-defmethod oclosure-test-gen ((_x oclosure))
(format "#<oclosure:%s>" (cl-call-next-method)))
(cl-defmethod oclosure-test-gen ((_x oclosure-test))
(format "#<oclosure-test:%s>" (cl-call-next-method)))
(ert-deftest oclosure-test ()
(let* ((i 42)
(ocl1 (oclosure-lambda (oclosure-test (fst 1) (snd 2) (name "hi"))
@ -51,6 +61,9 @@
(should (equal (funcall (oclosure-test-copy1 ocl1 9)) '(9 2 44)))
(should (cl-typep ocl1 'oclosure-test))
(should (cl-typep ocl1 'oclosure))
(should (member (oclosure-test-gen ocl1)
'("#<oclosure-test:#<oclosure:#<cons>>>"
"#<oclosure-test:#<oclosure:#<bytecode>>>")))
))
(ert-deftest oclosure-test-limits ()