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:
parent
611179d000
commit
ff067408e4
4 changed files with 73 additions and 18 deletions
|
@ -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 ()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue