X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftypedefs.lisp;h=36c840628d3aa202ec1ac4f5ddd4cf279fb602a1;hb=cd176690400f8b6fa23faa4dc6fa8494bcbce480;hp=1139ab6978357d5657c2abc35bd637769d021d93;hpb=0b5610d8a220a4b20cbeac958953ca4d67c00038;p=sbcl.git diff --git a/src/code/typedefs.lisp b/src/code/typedefs.lisp index 1139ab6..36c8406 100644 --- a/src/code/typedefs.lisp +++ b/src/code/typedefs.lisp @@ -27,7 +27,7 @@ ;;; Define the translation from a type-specifier to a type structure for ;;; some particular type. Syntax is identical to DEFTYPE. (defmacro !def-type-translator (name arglist &body body) - (check-type name symbol) + (declare (type symbol name)) ;; FIXME: Now that the T%CL hack is ancient history and we just use CL ;; instead, we can probably return to using PARSE-DEFMACRO here. ;; @@ -63,19 +63,19 @@ (:constructor nil) (:make-load-form-fun make-type-load-form) #-sb-xc-host (:pure t)) - ;; The class of this type. + ;; the class of this type ;; ;; FIXME: It's unnecessarily confusing to have a structure accessor ;; named TYPE-CLASS-INFO which is an accessor for the CTYPE structure ;; even though the TYPE-CLASS structure also exists in the system. ;; Rename this slot: TYPE-CLASS or ASSOCIATED-TYPE-CLASS or something. - (class-info (required-argument) :type type-class) - ;; True if this type has a fixed number of members, and as such could - ;; possibly be completely specified in a MEMBER type. This is used by the - ;; MEMBER type methods. - (enumerable nil :type (member t nil) :read-only t) - ;; an arbitrary hash code used in EQ-style hashing of identity (since EQ - ;; hashing can't be done portably) + (class-info (missing-arg) :type type-class) + ;; True if this type has a fixed number of members, and as such + ;; could possibly be completely specified in a MEMBER type. This is + ;; used by the MEMBER type methods. + (enumerable nil :read-only t) + ;; an arbitrary hash code used in EQ-style hashing of identity + ;; (since EQ hashing can't be done portably) (hash-value (random (1+ most-positive-fixnum)) :type (and fixnum unsigned-byte) :read-only t)) @@ -88,60 +88,26 @@ (declare (type ctype type)) `(specifier-type ',(type-specifier type))) -;;;; utilities +;;;; miscellany -;;; sort of like ANY and EVERY, except: -;;; * We handle two-VALUES predicate functions like SUBTYPEP. (And -;;; if the result is uncertain, then we return (VALUES NIL NIL).) -;;; * THING is just an atom, and we apply OP (an arity-2 function) -;;; successively to THING and each element of LIST. -(defun any/type (op thing list) - (declare (type function op)) - (let ((certain? t)) - (dolist (i list (values nil certain?)) - (multiple-value-bind (sub-value sub-certain?) - (funcall op thing i) - (unless sub-certain? (setf certain? nil)) - (when sub-value (return (values t t))))))) -(defun every/type (op thing list) - (declare (type function op)) - (dolist (i list (values t t)) - (multiple-value-bind (sub-value sub-certain?) - (funcall op thing i) - (unless sub-certain? (return (values nil nil))) - (unless sub-value (return (values nil t)))))) - -;;; Return a function like FUN, but expecting its (two) arguments in -;;; the opposite order that FUN does. -;;; -;;; (This looks like a sort of general utility, but currently it's -;;; used only in the implementation of the type system, so it's -;;; internal to SB-KERNEL. -- WHN 2001-02-13) -(declaim (inline swapped-args-fun)) -(defun swapped-args-fun (fun) - (declare (type function fun)) - (lambda (x y) - (funcall fun y x))) - -;;; Compute the intersection for types that intersect only when one is a -;;; hierarchical subtype of the other. -(defun vanilla-intersection (type1 type2) - (multiple-value-bind (stp1 win1) (csubtypep type1 type2) - (multiple-value-bind (stp2 win2) (csubtypep type2 type1) - (cond (stp1 (values type1 t)) - (stp2 (values type2 t)) - ((and win1 win2) (values *empty-type* t)) - (t - (values type1 nil)))))) - -(defun vanilla-union (type1 type2) +;;; Look for nice relationships for types that have nice relationships +;;; only when one is a hierarchical subtype of the other. +(defun hierarchical-intersection2 (type1 type2) + (multiple-value-bind (subtypep1 win1) (csubtypep type1 type2) + (multiple-value-bind (subtypep2 win2) (csubtypep type2 type1) + (cond (subtypep1 type1) + (subtypep2 type2) + ((and win1 win2) *empty-type*) + (t nil))))) +(defun hierarchical-union2 (type1 type2) (cond ((csubtypep type1 type2) type2) ((csubtypep type2 type1) type1) (t nil))) -;;; Hash two things (types) down to 8 bits. In CMU CL this was an EQ hash, but -;;; since it now needs to run in vanilla ANSI Common Lisp at cross-compile -;;; time, it's now based on the CTYPE-HASH-VALUE field instead. +;;; Hash two things (types) down to 8 bits. In CMU CL this was an EQ +;;; hash, but since it now needs to run in vanilla ANSI Common Lisp at +;;; cross-compile time, it's now based on the CTYPE-HASH-VALUE field +;;; instead. ;;; ;;; FIXME: This was a macro in CMU CL, and is now an INLINE function. Is ;;; it important for it to be INLINE, or could be become an ordinary