mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-05 22:20:24 -08:00
cl-preloaded.el: Fix the type lattice
We generally want types to form not just a DAG but a lattice. If objects can be both `keyword` and `symbol-with-pos`, this means there should be a more precise type describing this intersection. If we ever find the need for such a refinement, we could add such a `keyword-with-pos` type, but here I took the simpler route of treating `keyword` not as a proper built-in type but as a second-class type like `natnum`. While fixing this problem, also fix the problem we had where `functionp` was not quite adequate to characterize objects of type `function`, by introducing a new predicate `cl-functionp` for that. * lisp/emacs-lisp/cl-preloaded.el (cl-functionp): New function. (function): Use it. (keyword): Don't declare it as a built-in type. (user-ptrp): Remove redundant declaration. * lisp/emacs-lisp/cl-generic.el (cl--generic--unreachable-types): Delete constant. (cl-generic-generalizers): Remove corresponding test. * lisp/emacs-lisp/cl-macs.el (cl-deftype-satisfies): Add entry for `keyword` type. * lisp/emacs-lisp/comp.el (comp-known-predicates): Fix type for negative result of `characterp`. Remove duplicate `numberp` entry. Fix types for `keywordp` now that `keyword` is not a built-in type any more. * test/src/data-tests.el (data-tests--cl-type-of): Add a few cases. Remove workaround for `function`.
This commit is contained in:
parent
351d98535d
commit
004f2493a5
6 changed files with 37 additions and 36 deletions
|
|
@ -349,6 +349,14 @@ The `slots' (and hence `index-table') are currently unused."
|
|||
;; so the DAG of OClosure types is "orthogonal" to the distinction
|
||||
;; between interpreted and compiled functions.
|
||||
|
||||
(defun cl-functionp (object)
|
||||
"Return non-nil if OBJECT is a member of type `function'.
|
||||
This is like `functionp' except that it returns nil for all lists and symbols,
|
||||
regardless if `funcall' would accept to call them."
|
||||
(memq (cl-type-of object)
|
||||
'(primitive-function subr-native-elisp module-function
|
||||
interpreted-function byte-code-function)))
|
||||
|
||||
(cl--define-built-in-type t nil "Abstract supertype of everything.")
|
||||
(cl--define-built-in-type atom t "Abstract supertype of anything but cons cells."
|
||||
:predicate atom)
|
||||
|
|
@ -356,11 +364,9 @@ The `slots' (and hence `index-table') are currently unused."
|
|||
(cl--define-built-in-type tree-sitter-compiled-query atom)
|
||||
(cl--define-built-in-type tree-sitter-node atom)
|
||||
(cl--define-built-in-type tree-sitter-parser atom)
|
||||
(declare-function user-ptrp "data.c")
|
||||
(when (fboundp 'user-ptrp)
|
||||
(cl--define-built-in-type user-ptr atom nil
|
||||
;; FIXME: Shouldn't it be called
|
||||
;; `user-ptr-p'?
|
||||
;; FIXME: Shouldn't it be called `user-ptr-p'?
|
||||
:predicate user-ptrp))
|
||||
(cl--define-built-in-type font-object atom)
|
||||
(cl--define-built-in-type font-entity atom)
|
||||
|
|
@ -410,8 +416,6 @@ The `slots' (and hence `index-table') are currently unused."
|
|||
The size depends on the Emacs version and compilation options.
|
||||
For this build of Emacs it's %dbit."
|
||||
(1+ (logb (1+ most-positive-fixnum)))))
|
||||
(cl--define-built-in-type keyword (symbol)
|
||||
"Type of those symbols whose first char is `:'.")
|
||||
(cl--define-built-in-type boolean (symbol)
|
||||
"Type of the canonical boolean values, i.e. either nil or t.")
|
||||
(cl--define-built-in-type symbol-with-pos (symbol)
|
||||
|
|
@ -431,7 +435,8 @@ For this build of Emacs it's %dbit."
|
|||
;; Example of slots we could document.
|
||||
(car car) (cdr cdr))
|
||||
(cl--define-built-in-type function (atom)
|
||||
"Abstract supertype of function values.")
|
||||
"Abstract supertype of function values."
|
||||
:predicate cl-functionp)
|
||||
(cl--define-built-in-type compiled-function (function)
|
||||
"Abstract type of functions that have been compiled.")
|
||||
(cl--define-built-in-type byte-code-function (compiled-function)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue