cl-preloaded.el: Further fine-tuning

* lisp/emacs-lisp/cl-preloaded.el (cl--direct-supertypes-of-type):
Fix some left over issues:
- Remove redundant `number-or-marker` from `marker`s parents.
- Add `function` to the types, since it was missing.
(cl--typeof-types): Add a warning for missing type info.

* admin/syncdoc-type-hierarchy.el (syncdoc-hierarchy): Fix parent of
`oclosure`.

* doc/lispref/type_hierarchy.txt:
* doc/lispref/type_hierarchy.jpg: Update.
This commit is contained in:
Stefan Monnier 2024-03-04 23:12:29 -05:00
parent 1a35eb86b8
commit 418ad866bf
4 changed files with 46 additions and 26 deletions

View file

@ -69,7 +69,7 @@
(not (eq type 'eieio-default-superclass)))
'(eieio-default-superclass))
;; OClosures can still be lists :-(
((eq 'oclosure type) '(t))
((eq 'oclosure type) '(function))
(t '(atom)))
ht)))))
ht))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 232 KiB

View file

@ -1,22 +1,27 @@
| Type | Derived Types |
|-------------------+----------------------------------------------------------|
| t | sequence atom |
| sequence | list array |
| atom | class structure tree-sitter-compiled-query |
| | tree-sitter-node tree-sitter-parser user-ptr font-object |
| | font-entity font-spec condvar mutex thread terminal |
| | hash-table frame buffer function window process |
| | window-configuration overlay integer-or-marker |
| | number-or-marker symbol array obarray |
| number | float integer |
| number-or-marker | marker number |
| integer | bignum fixnum |
| symbol | keyword boolean symbol-with-pos |
| array | vector bool-vector char-table string |
| list | null cons |
| integer-or-marker | integer marker |
| compiled-function | byte-code-function |
| function | subr module-function compiled-function |
| boolean | null |
| subr | subr-native-elisp subr-primitive |
| symbol-with-pos | keyword |
| Type | Derived Types |
|--------------------------+------------------------------------------------------------|
| t | sequence atom |
| sequence | list array |
| atom | array function tree-sitter-compiled-query tree-sitter-node |
| | tree-sitter-parser user-ptr font-object font-entity |
| | font-spec condvar mutex thread terminal hash-table frame |
| | buffer window process window-configuration overlay |
| | number-or-marker symbol obarray native-comp-unit |
| | cl-structure-object eieio-default-superclass |
| number | float integer |
| integer-or-marker | integer marker |
| number-or-marker | integer-or-marker number |
| integer | bignum fixnum |
| symbol | keyword boolean symbol-with-pos |
| array | vector bool-vector char-table string |
| boolean | null |
| list | null cons |
| compiled-function | byte-code-function subr |
| function | module-function compiled-function oclosure |
| subr | subr-native-elisp subr-primitive |
| oclosure | advice kmacro |
| cl--class | oclosure--class cl-structure-class eieio--class |
| cl-structure-object | cl--class xref-elisp-location frameset-register |
| eieio-default-superclass | eieio-named transient-child |
| transient-suffix | transient-infix |
| transient-child | transient-suffix |

View file

@ -51,14 +51,25 @@
(signal 'cl-assertion-failed `(,form ,@sargs)))))
(defconst cl--direct-supertypes-of-type
;; Please run `sycdoc-update-type-hierarchy' in
;; `admin/syncdoc-type-hierarchy.el' each time this is modified to
;; reflect the change in the documentation.
(let ((table (make-hash-table :test #'eq)))
;; FIXME: Our type DAG has various quirks:
;; - `subr' says it's a `compiled-function' but that's not true
;; for those subrs that are special forms!
;; - Some `keyword's are also `symbol-with-pos' but that's not reflected
;; in the DAG.
;; - An OClosure can be an interpreted function or a `byte-code-function',
;; so the DAG of OClosure types is "orthogonal" to the distinction
;; between interpreted and compiled functions.
(dolist (x '((sequence t)
(atom t)
(list sequence)
(array sequence atom)
(float number)
(integer number integer-or-marker)
(marker integer-or-marker number-or-marker)
(marker integer-or-marker)
(integer-or-marker number-or-marker)
(number number-or-marker)
(bignum integer)
@ -73,10 +84,11 @@
;; FIXME: This results in `atom' coming before `list' :-(
(null boolean list)
(cons list)
(function atom)
(byte-code-function compiled-function)
(subr compiled-function)
(module-function function atom)
(compiled-function function atom)
(module-function function)
(compiled-function function)
(subr-native-elisp subr)
(subr-primitive subr)))
(puthash (car x) (cdr x) table))
@ -100,8 +112,11 @@
(lambda (type)
;; FIXME: copy&pasted from `cl--class-allparents'.
(let ((parents (gethash type cl--direct-supertypes-of-type)))
(unless parents
(message "Warning: Type without parent: %S!" type))
(cons type
(merge-ordered-lists
;; FIXME: Can't remember why `t' is excluded.
(mapcar allparents (remq t parents))))))))
(maphash (lambda (type _)
(push (funcall allparents type) alist))