;; TYPEP of one arg ((not type-specified-p) (setq dtp (%data-type object)) ;; Cannot use TYPE-OF, since we must ;; for back-compatibility return keywords. (cond ((eq dtp dtp-instance) (%p-contents-offset (instance-flavor object) %instance-descriptor-typename)) ((eq dtp dtp-array-pointer) (cond ((named-structure-p object)) ((stringp object) :string) (t :array))) ; ((eq dtp dtp-entity) ; (class-symbol object)) ((eq dtp dtp-extended-number) (select (%p-ldb-offset %%header-type-field object 0) (%header-type-flonum :flonum) (%header-type-bignum :bignum) (%header-type-rational :rational) (%header-type-complex :complex) (otherwise :random))) ((cdr (assq dtp typep-one-arg-alist))) (t :random))) (define-type structure (:predicate (object) (not (null (named-structure-p object)))) (:optimizer (expression) `(not (null (named-structure-p ,(cadr expression)))))) (define-type named-structure structure) (define-type character (:predicate characterp) (:subtypes standard-char string-char fat-char)) (define-type fat-char (:predicate (object) (and (characterp object) ( object 0) (< object (lsh 1 #o20)))) (:optimizer (expression) (setq expression (cadr expression)) (once-only (expression) `(and ( ,expression 0) (< ,expression (lsh 1 #o20))))) (:subtypes string-char standard-char)) (define-type non-complex-number (:predicate (object &optional (low '*) (high '*)) (and (non-complex-number-p object) (non-complex-number-in-range-p object low high 'non-complex-number))) (:optimizer (expression &optional (low '*) (high '*)) (optimize-numeric-type-test 'non-complex-number-p expression low high)) (:subtypep-predicate dense-arithmetic-subtypep) (:disjoint-typep-predicate real-disjoint-typep) (:canonicalizer canonicalize-real-type-specifier) (:subtypes rational integer fixnum ratio bignum float short-float single-float)) (define-type real (:predicate (object &optional (low '*) (high '*)) (and (realp object) (setq object (realpart object)) (non-complex-number-in-range-p object low high 'real))) (:optimizer (expression &optional (low '*) (high '*)) (if (and (eq low '*) (eq high '*)) `(realp ,(cadr expression)) (let ((object (cadr expression)) (o (gensym))) `(let ((,o ,object)) (block real (and (setq ,o (typecase ,o (complex (%complex-real-part ,o)) (number ,o) (t (return-from real nil)))) ,(cond ((eq low '*) t) ((numberp low) `( ,o ,low)) ((consp low) `(> ,o ,(car low)))) ,(cond ((eq high '*) t) ((numberp high) `( ,o ,high)) ((consp high) `(< ,o ,(car high)))))))))) (:subtypep-predicate dense-arithmetic-subtypep) (:disjoint-typep-predicate real-disjoint-typep) (:canonicalizer canonicalize-real-type-specifier) (:subtypes rational integer fixnum ratio bignum float short-float single-float non-complex-number)) ;>>?? (define-type fix integer) (define-type small-flonum short-float) (define-type small-float short-float) (define-type flonum single-float) (define-type :array array) (define-type :atom atom) (define-type :bignum bignum) (define-type :character cl:character) (define-type :closure closure) (define-type :compiled-function compiled-function) (define-type :complex complex) (define-type :cons cons) (define-type :double-float double-float) (define-type :entity entity) (define-type :fix integer) (define-type :fixnum fixnum) (define-type :flonum single-float) (define-type :float float) (define-type :instance instance) (define-type :integer integer) (define-type :locative locative) (define-type :long-float long-float) (define-type :microcode-function microcode-function) (define-type :named-structure structure) (define-type :null null) (define-type :number number) (define-type :ratio ratio) (define-type :rational rational) (define-type :select select) (define-type :select-method select) (define-type :short-float short-float) (define-type :single-float single-float) (define-type :small-flonum short-float) (define-type :string string) (define-type :symbol symbol) (define-type :list cons)