(FILECREATED "10-Sep-86 17:58:11" {ERIS}<LISPCORE>LIBRARY>CMLTYPES.;61 34410  

      changes to:  (TYPES ARRAY VECTOR SIMPLE-ARRAY)

      previous date: " 8-Sep-86 15:17:31" {ERIS}<LISPCORE>LIBRARY>CMLTYPES.;60)


(* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT CMLTYPESCOMS)

(RPAQQ CMLTYPESCOMS 
       ((* * Predicates)
        (FUNCTIONS CL:EQUAL EQUALP)
        (* EQL is now in the init)
        (* * Typep and friends)
        (FUNCTIONS COERCE TYPECASE TYPEP TYPE-OF)
        (* * Optimizers)
        (OPTIMIZERS COERCE FALSE TRUE TYPEP)
        (* Optimize by constant fold and coerce to EQ where possible)
        (PROP BYTEMACRO CL:EQUAL EQUALP)
        (* * Support functions)
        (FNS ARRAY-TYPE FALSE SYMBOL-TYPE TRUE \RANGE.TYPE \TYPEP.EXPAND.MACRO \TYPEP.PRED)
        (FUNCTIONS DEFTYPE)
        (DEFINE-TYPES TYPES)
        (* * For TYPEP)
        (TYPES CL:ATOM BIGNUM BIT CL:CHARACTER CONS DOUBLE-FLOAT FIXNUM FLOAT FUNCTION HASH-TABLE 
               INTEGER KEYWORD LIST LONG-FLOAT CL:MEMBER CL:MOD NULL NUMBER PACKAGE SHORT-FLOAT 
               SIGNED-BYTE STANDARD-CHAR STRING-CHAR SINGLE-FLOAT SYMBOL UNSIGNED-BYTE RATIONAL 
               READTABLE COMMON COMPILED-FUNCTION COMPLEX SEQUENCE)
        (* * Array Types)
        (TYPES ARRAY VECTOR SIMPLE-STRING STRING SIMPLE-ARRAY SIMPLE-VECTOR BIT-VECTOR 
               SIMPLE-BIT-VECTOR)
        (* * for TYPE-OF - Interlisp types that have different common Lisp names)
        (PROP CMLTYPE CHARACTER FIXP FLOATP GENERAL-ARRAY LISTP LITATOM ONED-ARRAY SMALLP STRINGP 
              HARRAYP TWOD-ARRAY)
        (PROP CMLSUBTYPEDESCRIMINATOR SYMBOL ARRAY)
        (* * What's this for?)
        (COMS (PROP PROPTYPE DEFTYPE))
        (* * Compiler options)
        (PROP FILETYPE CMLTYPES)
        (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (LOCALVARS . T))
        (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
                                                                            (NLAML)
                                                                            (LAMA)))))
(* * Predicates)

(DEFUN CL:EQUAL (X Y)
   (OR (EQL X Y)
       (TYPECASE X (CONS (AND (CONSP Y)
                              (CL:EQUAL (CAR X)
                                     (CAR Y))
                              (CL:EQUAL (CDR X)
                                     (CDR Y))))
              (STRING (AND (CL:STRINGP Y)
                           (STRING= X Y)))
              (BIT-VECTOR (AND (BIT-VECTOR-P Y)
                               (LET ((SX (CL:LENGTH X)))
                                    (AND (EQL SX (CL:LENGTH Y))
                                         (DOTIMES (I SX T)
                                                (CL:IF (NOT (EQ (BIT X I)
                                                                (BIT Y I)))
                                                       (RETURN NIL)))))))
              (PATHNAME (AND (PATHNAMEP Y)
                             (%%PATHNAME-EQUAL X Y)))
              (T NIL))))

(DEFUN EQUALP (X Y)
   (OR (EQL X Y)
       (TYPECASE X (NUMBER (AND (NUMBERP Y)
                                (= X Y)))
              (CONS (AND (CONSP Y)
                         (EQUALP (CAR X)
                                (CAR Y))
                         (EQUALP (CDR X)
                                (CDR Y))))
              (CL:CHARACTER (AND (CHARACTERP Y)
                                 (CHAR-EQUAL X Y)))
              (STRING (AND (CL:STRINGP Y)
                           (STRING-EQUAL X Y)))
              (PATHNAME (AND (PATHNAMEP Y)
                             (%%PATHNAME-EQUAL X Y)))
              (VECTOR (AND (VECTORP Y)
                           (LET ((SX (CL:LENGTH X)))
                                (AND (EQL SX (CL:LENGTH Y))
                                     (DOTIMES (I SX T)
                                            (CL:IF (NOT (EQUALP (AREF X I)
                                                               (AREF Y I)))
                                                   (RETURN NIL)))))))
              (ARRAY (AND (CL:ARRAYP Y)
                          (CL:EQUAL (ARRAY-DIMENSIONS X)
                                 (ARRAY-DIMENSIONS Y))
                          (LET ((FX (\FLATTEN-ARRAY X))
                                (FY (\FLATTEN-ARRAY Y)))
                               (DOTIMES (I (ARRAY-TOTAL-SIZE X)
                                           T)
                                      (CL:IF (NOT (EQUALP (AREF FX I)
                                                         (AREF FY I)))
                                             (RETURN NIL))))))
              (T NIL))))




(* EQL is now in the init)

(* * Typep and friends)

(DEFUN COERCE (OBJECT RESULT-TYPE) "Coerce object to result-type if possible"
   (COND
      ((EQ RESULT-TYPE T)
       OBJECT)
      ((EQ RESULT-TYPE (QUOTE CL:CHARACTER))
       (CL:CHARACTER OBJECT))
      ((CL:MEMBER RESULT-TYPE (QUOTE (FLOAT SINGLE-FLOAT DOUBLE-FLOAT LONG-FLOAT)))
       (FLOAT OBJECT))
      ((EQ RESULT-TYPE (QUOTE COMPLEX))
       (CL:IF (COMPLEXP OBJECT)
              OBJECT
              (COMPLEX OBJECT)))
      ((TYPEP OBJECT (QUOTE SEQUENCE))
       (CL:MAP RESULT-TYPE (QUOTE IDENTITY)
              OBJECT))
      (T (CL:ERROR "Cannot coerce to type: ~S" RESULT-TYPE))))

(DEFMACRO TYPECASE (KEYFORM &REST FORMS) 
                         "Type dispatch, order is important, more specific types should appear first"
   (BQUOTE (LET (($$TYPE-VALUE (\, KEYFORM)))
                (COND
                   .,
                   (CL:MAPCAR (FUNCTION (LAMBDA (FORM)
                                          (LET ((TYPE (CL:IF (EQ (CAR FORM)
                                                                 (BQUOTE OTHERWISE))
                                                             T
                                                             (CAR FORM)))
                                                (FORM (CDR FORM)))
                                               (BQUOTE ((TYPEP $$TYPE-VALUE (QUOTE (\, TYPE)))
                                                        ., FORM)))))
                          FORMS)))))

(DEFUN TYPEP (OBJECT TYPE) "Check if OBJECT is of type TYPE" (AND (FUNCALL (\TYPEP.PRED TYPE)
                                                                         OBJECT)
                                                                  T))

(DEFUN TYPE-OF (X) (LET ((TYPE (TYPENAME X)))
                        (SETQ TYPE (OR (GETPROP TYPE (QUOTE CMLTYPE))
                                       TYPE))
                        (OR (LET ((D (GETPROP TYPE (QUOTE CMLSUBTYPEDESCRIMINATOR))))
                                 (AND D (FUNCALL D X)))
                            TYPE)))

(* * Optimizers)

(DEFOPTIMIZER COERCE (OBJECT RESULT-TYPE) "Open code the simple coerce cases"
   (LET ((CE (CAR (CONSTANTEXPRESSIONP RESULT-TYPE))))
        (COND
           ((EQ CE T)
            OBJECT)
           ((EQ CE (QUOTE CL:CHARACTER))
            (BQUOTE (CL:CHARACTER (\, OBJECT))))
           ((EQ CE (QUOTE COMPLEX))
            (BQUOTE (CL:IF (COMPLEXP (\, OBJECT))
                           (\, OBJECT)
                           (COMPLEX (\, OBJECT)))))
           ((CL:MEMBER CE (QUOTE (FLOAT SINGLE-FLOAT DOUBLE-FLOAT LONG-FLOAT)))
            (BQUOTE (FLOAT (\, OBJECT))))
           (T (QUOTE COMPILER:PASS)))))

(DEFOPTIMIZER FALSE (&BODY FORMS) (BQUOTE (PROG1 NIL (\,@ FORMS))))

(DEFOPTIMIZER TRUE (&BODY FORMS) (BQUOTE (PROG1 T (\,@ FORMS))))

(DEFOPTIMIZER TYPEP (OBJ TYPESPEC) (LET ((CE (CONSTANTEXPRESSIONP TYPESPEC)))
                                        (CL:IF CE (BQUOTE (AND ((\, (\TYPEP.PRED (CAR CE)))
                                                                (\, OBJ))
                                                               T))
                                               (QUOTE COMPILER:PASS))))




(* Optimize by constant fold and coerce to EQ where possible)


(PUTPROPS CL:EQUAL BYTEMACRO COMP.EQ)

(PUTPROPS EQUALP BYTEMACRO COMP.EQ)
(* * Support functions)

(DEFINEQ

(ARRAY-TYPE
  (LAMBDA (ARRAY)                                            (* lmm "21-Jul-86 03:19")
    (LET ((RANK (ARRAY-RANK ARRAY)))
         (CL:IF (SIMPLE-ARRAY-P ARRAY)
                (CL:IF (EQL 1 RANK)
                       (LET ((SIZE (ARRAY-TOTAL-SIZE ARRAY)))
                            (COND
                               ((SIMPLE-STRING-P ARRAY)
                                (LIST (QUOTE SIMPLE-STRING)
                                      SIZE))
                               ((SIMPLE-BIT-VECTOR-P ARRAY)
                                (LIST (QUOTE SIMPLE-BIT-VECTOR)
                                      SIZE))
                               (T (LET ((A-ELT-TYPE (ARRAY-ELEMENT-TYPE ARRAY)))
                                       (CL:IF (EQ A-ELT-TYPE T)
                                              (LIST (QUOTE SIMPLE-VECTOR)
                                                    SIZE)
                                              (LIST (QUOTE SIMPLE-ARRAY)
                                                    A-ELT-TYPE
                                                    (LIST SIZE)))))))
                       (LIST (QUOTE SIMPLE-ARRAY)
                             (ARRAY-ELEMENT-TYPE ARRAY)
                             (ARRAY-DIMENSIONS ARRAY)))
                (CL:IF (EQL 1 RANK)
                       (LET ((SIZE (ARRAY-TOTAL-SIZE ARRAY)))
                            (COND
                               ((CL:STRINGP ARRAY)
                                (LIST (QUOTE STRING)
                                      SIZE))
                               ((BIT-VECTOR-P ARRAY)
                                (LIST (QUOTE BIT-VECTOR)
                                      SIZE))
                               (T (LIST (QUOTE VECTOR)
                                        (ARRAY-ELEMENT-TYPE ARRAY)
                                        SIZE))))
                       (LIST (QUOTE ARRAY)
                             (ARRAY-ELEMENT-TYPE ARRAY)
                             (ARRAY-DIMENSIONS ARRAY)))))))

(FALSE
  (LAMBDA NIL NIL))

(SYMBOL-TYPE
  (LAMBDA (X)                                                (* lmm " 8-May-86 01:57")
    (CL:IF (KEYWORDP X)
           (QUOTE KEYWORD)
           (QUOTE SYMBOL))))

(TRUE
  (LAMBDA NIL T))

(\RANGE.TYPE
  (LAMBDA (BASETYPE LOW HIGH RANGELIST)                      (* Pavel " 2-Sep-86 19:26")
    (OR LOW (SETQ LOW (QUOTE CL:*)))
    (OR HIGH (SETQ HIGH (QUOTE CL:*)))
    (COND
       ((AND (EQ LOW (QUOTE CL:*))
             (EQ HIGH (QUOTE CL:*)))
        BASETYPE)
       ((OR (EQ LOW (QUOTE CL:*))
            (EQ HIGH (QUOTE CL:*)))
        (BQUOTE (AND (\, BASETYPE)
                     (SATISFIES (LAMBDA (X)
                                  (AND (\,@ (CL:IF (NOT (EQ LOW (QUOTE CL:*)))
                                                   (BQUOTE (((\, (COND
                                                                    ((LISTP LOW)
                                                                     (SETQ LOW (CAR LOW))
                                                                     (QUOTE <))
                                                                    (T (QUOTE <=))))
                                                             (\, LOW)
                                                             X)))))
                                       (\,@ (CL:IF (NOT (EQ HIGH (QUOTE CL:*)))
                                                   (BQUOTE (((\, (COND
                                                                    ((LISTP HIGH)
                                                                     (SETQ HIGH (CAR HIGH))
                                                                     (QUOTE <))
                                                                    (T (QUOTE <=))))
                                                             X
                                                             (\, HIGH))))))))))))
       (T (DOLIST (X RANGELIST (BQUOTE (AND (\, BASETYPE)
                                            (SATISFIES (LAMBDA (X)
                                                         (AND ((\, (COND
                                                                      ((LISTP LOW)
                                                                       (SETQ LOW (CAR LOW))
                                                                       (QUOTE <))
                                                                      (T (QUOTE <=))))
                                                               (\, LOW)
                                                               X)
                                                              ((\, (COND
                                                                      ((LISTP HIGH)
                                                                       (SETQ HIGH (CAR HIGH))
                                                                       (QUOTE <))
                                                                      (T (QUOTE <=))))
                                                               X
                                                               (\, HIGH))))))))
                 (CL:IF (AND (EQUAL LOW (CAR X))
                             (EQUAL HIGH (CADR X)))
                        (RETURN (CADDR X)))
                 (CL:IF (<= (CAR X)
                         (CL:IF (CONSP LOW)
                                (1+ (CAR LOW))
                                LOW)
                         (CL:IF (CONSP HIGH)
                                (1- (CAR HIGH))
                                HIGH)
                         (CADR X))
                        (SETQ BASETYPE (CADDR X))))))))

(\TYPEP.EXPAND.MACRO
  (LAMBDA (PROP TYPE)                                        (* lmm "18-Jul-86 16:40")
    (EXPAND-DEFMACRO (CDR PROP)
           TYPE
           (QUOTE CL:*))))

(\TYPEP.PRED
  (LAMBDA (TYPE)                                             (* lmm "18-Mar-86 18:25")
    (COND
       ((LISTP TYPE)
        (OR (GETHASH TYPE CLISPARRAY)
            (PUTHASH TYPE (CASE (CAR TYPE)
                                (SATISFIES (CADR TYPE))
                                (DATATYPE 
          
          (* (\INSTANCE-P NIL (QUOTE SYMBOL)) incorrectly returns NIL
          (DATATYPE (BQUOTE (OPENLAMBDA (X) (\INSTANCE-P X
          (QUOTE (\, (CADR TYPE))))))))

                                       (BQUOTE (OPENLAMBDA (X)
                                                      (TYPENAMEP X (QUOTE (\, (CADR TYPE)))))))
                                ((AND OR NOT)
                                 (BQUOTE (OPENLAMBDA (X)
                                                ((\, (CAR TYPE))
                                                 (\,@ (CL:MAPCAR (FUNCTION (LAMBDA (PRED)
                                                                             (LIST (\TYPEP.PRED
                                                                                    PRED)
                                                                                   (QUOTE X))))
                                                             (CDR TYPE)))))))
                                (OTHERWISE (LET ((PROP (GETPROP (CAR TYPE)
                                                              (QUOTE DEFTYPE))))
                                                (CL:IF (EQ (CAR PROP)
                                                           (QUOTE MACRO))
                                                       (\TYPEP.PRED (\TYPEP.EXPAND.MACRO PROP TYPE))
                                                       (CL:ERROR "undefined type used in TYPEP: ~S" 
                                                              TYPE NIL)))))
                   CLISPARRAY)))
       (T (COND
             ((EQ TYPE T)
              (QUOTE TRUE))
             ((EQ TYPE NIL)
              (QUOTE FALSE))
             (T (LET ((PROP (GETPROP TYPE (QUOTE DEFTYPE))))
                     (CL:IF (EQ (CAR PROP)
                                (QUOTE MACRO))
                            (\TYPEP.PRED (\TYPEP.EXPAND.MACRO PROP (LIST TYPE)))
                            (PROGN (PRINTOUT T "Warning: type " TYPE " assumed to be datatype" T)
                                   (/PUTPROP TYPE (QUOTE DEFTYPE)
                                          (BQUOTE (MACRO NIL (QUOTE (DATATYPE (\, TYPE))))))
                                   (\TYPEP.PRED TYPE))))))))))
)
(DEFDEFINER DEFTYPE TYPES (NAME LAMBDA-LIST &BODY BODY)
                          (BQUOTE (PUTPROPS (\, NAME)
                                         DEFTYPE
                                         (MACRO (\, LAMBDA-LIST)
                                                (\, (MKPROGN BODY))))))

(DEF-DEFINE-TYPE TYPES "Common Lisp type definitions" )

(* * For TYPEP)

(DEFTYPE CL:ATOM NIL (QUOTE (SATISFIES CL:ATOM)))

(DEFTYPE BIGNUM NIL (QUOTE (OR (DATATYPE FIXP)
                               (DATATYPE BIGNUM))))

(DEFTYPE BIT NIL (QUOTE (CL:MOD 2)))

(DEFTYPE CL:CHARACTER NIL (QUOTE (SATISFIES CHARACTERP)))

(DEFTYPE CONS NIL (QUOTE (DATATYPE LISTP)))

(DEFTYPE DOUBLE-FLOAT (&REST X) (CONS (QUOTE FLOAT)
                                      X))

(DEFTYPE FIXNUM NIL (QUOTE (DATATYPE SMALLP)))

(DEFTYPE FLOAT (&OPTIONAL LOW HIGH) (\RANGE.TYPE (QUOTE (DATATYPE FLOATP))
                                           LOW HIGH))

(DEFTYPE FUNCTION NIL (QUOTE (SATISFIES FUNCTIONP)))

(DEFTYPE HASH-TABLE NIL (QUOTE (DATATYPE HARRAYP)))

(DEFTYPE INTEGER (&OPTIONAL LOW HIGH) (\RANGE.TYPE (QUOTE (SATISFIES INTEGERP))
                                             LOW HIGH (QUOTE ((-65536 65535 FIXNUM)
                                                              (0 1 (CL:MEMBER 0 1))))))

(DEFTYPE KEYWORD NIL (QUOTE (SATISFIES KEYWORDP)))

(DEFTYPE LIST (&OPTIONAL TYPE)
   (CL:IF (EQ TYPE (QUOTE CL:*))
          (QUOTE (OR NULL CONS))
          (BQUOTE (AND LIST (SATISFIES (LAMBDA (X)
                                         (CL:EVERY (CL:FUNCTION (CL:LAMBDA (ELEMENT)
                                                                       (TYPEP ELEMENT
                                                                              (QUOTE (\, TYPE)))))
                                                X)))))))

(DEFTYPE LONG-FLOAT (&REST X) (CONS (QUOTE FLOAT)
                                    X))

(DEFTYPE CL:MEMBER (&REST VALUES) (BQUOTE (SATISFIES (LAMBDA (X)
                                                       (CL:MEMBER X (QUOTE (\, VALUES)))))))

(DEFTYPE CL:MOD (N) (BQUOTE (INTEGER 0 (\, (1- N)))))

(DEFTYPE NULL NIL (QUOTE (SATISFIES NULL)))

(DEFTYPE NUMBER NIL (QUOTE (SATISFIES NUMBERP)))

(DEFTYPE PACKAGE NIL (QUOTE (DATATYPE PACKAGE)))

(DEFTYPE SHORT-FLOAT (&REST REST) (CONS (QUOTE FLOAT)
                                        REST))

(DEFTYPE SIGNED-BYTE (&OPTIONAL S) (CL:IF (EQ S (QUOTE CL:*))
                                          (QUOTE INTEGER)
                                          (LET ((SIZE (CL:EXPT 2 (1- S))))
                                               (BQUOTE (INTEGER (\, (- S))
                                                              (\, (1- S)))))))

(DEFTYPE STANDARD-CHAR NIL (QUOTE (SATISFIES STANDARD-CHAR-P)))

(DEFTYPE STRING-CHAR NIL (QUOTE (SATISFIES STRING-CHAR-P)))

(DEFTYPE SINGLE-FLOAT (&REST REST) (CONS (QUOTE FLOAT)
                                         REST))

(DEFTYPE SYMBOL NIL (QUOTE (DATATYPE LITATOM)))

(DEFTYPE UNSIGNED-BYTE (&OPTIONAL S) (CL:IF (EQ S (QUOTE CL:*))
                                            (QUOTE (INTEGER 0))
                                            (BQUOTE (INTEGER 0 ((\, (CL:EXPT 2 S)))))))

(DEFTYPE RATIONAL NIL (QUOTE (OR RATIO INTEGER)))

(DEFTYPE READTABLE NIL (QUOTE (DATATYPE READTABLEP)))

(DEFTYPE COMMON T)

(DEFTYPE COMPILED-FUNCTION NIL (QUOTE (SATISFIES COMPILED-FUNCTION-P)))

(DEFTYPE COMPLEX (&OPTIONAL TYPE) (CL:IF (EQ TYPE (QUOTE CL:*))
                                         (QUOTE (DATATYPE COMPLEX))
                                         (BQUOTE (AND COMPLEX
                                                      (SATISFIES (LAMBDA (X)
                                                                   (AND (TYPEP (COMPLEX-REALPART
                                                                                X)
                                                                               (QUOTE (\, TYPE)))
                                                                        (TYPEP (COMPLEX-IMAGPART
                                                                                X)
                                                                               (QUOTE (\, TYPE)))))))
                                                )))

(DEFTYPE SEQUENCE (&OPTIONAL TYPE)
   (CL:IF (EQ TYPE (QUOTE CL:*))
          (QUOTE (OR VECTOR LIST))
          (BQUOTE (AND SEQUENCE (SATISFIES (LAMBDA (X)
                                             (CL:EVERY (CL:FUNCTION (CL:LAMBDA
                                                                     (ELEMENT)
                                                                     (TYPEP ELEMENT
                                                                            (QUOTE (\, TYPE)))))
                                                    X)))))))

(* * Array Types)

(DEFTYPE ARRAY (&OPTIONAL ELEMENT-TYPE DIMENSIONS)
   (CL:IF (TYPEP DIMENSIONS (QUOTE FIXNUM))
          (SETQ DIMENSIONS (MAKE-LIST DIMENSIONS :INITIAL-ELEMENT (QUOTE CL:*))))
   (CL:IF (NOT (EQ ELEMENT-TYPE (QUOTE CL:*)))
          (SETQ ELEMENT-TYPE (%%GET-CANONICAL-CML-TYPE ELEMENT-TYPE)))
   (COND
      ((EQ DIMENSIONS (QUOTE CL:*))
       (CL:IF (EQ ELEMENT-TYPE (QUOTE CL:*))
              (QUOTE (SATISFIES CL:ARRAYP))
              (BQUOTE (SATISFIES (LAMBDA (X)
                                   (AND (CL:ARRAYP X)
                                        (EQUAL (ARRAY-ELEMENT-TYPE X)
                                               (QUOTE (\, ELEMENT-TYPE)))))))))
      ((EQUAL DIMENSIONS (QUOTE (CL:*)))
       (COND
          ((EQ ELEMENT-TYPE (QUOTE CL:*))
           (QUOTE VECTOR))
          ((EQ ELEMENT-TYPE (QUOTE STRING-CHAR))
           (QUOTE STRING))
          ((OR (EQ ELEMENT-TYPE (QUOTE BIT))
               (EQUAL ELEMENT-TYPE (QUOTE (UNSIGNED-BYTE 1))))
           (QUOTE BIT-VECTOR))
          (T (BQUOTE (SATISFIES (LAMBDA (X)
                                  (AND (VECTORP X)
                                       (EQUAL (ARRAY-ELEMENT-TYPE X)
                                              (QUOTE (\, ELEMENT-TYPE))))))))))
      ((DOLIST (DIM DIMENSIONS T)
              (CL:IF (NOT (EQ DIM (QUOTE CL:*)))
                     (RETURN NIL)))
       (BQUOTE (SATISFIES (LAMBDA (X)
                            (AND (CL:ARRAYP X)
                                 (EQL (ARRAY-RANK X)
                                      (\, (CL:LENGTH DIMENSIONS)))
                                 (\,@ (CL:IF (NOT (EQ ELEMENT-TYPE (QUOTE CL:*)))
                                             (BQUOTE ((EQUAL (ARRAY-ELEMENT-TYPE X)
                                                             (QUOTE (\, ELEMENT-TYPE))))))))))))
      ((DOLIST (DIM DIMENSIONS T)
              (CL:IF (NOT (OR (EQ DIM (QUOTE CL:*))
                              (TYPEP DIM (QUOTE FIXNUM))))
                     (RETURN NIL)))
       (CL:IF (EQL (CL:LENGTH DIMENSIONS 1))
              (BQUOTE (VECTOR (\, (CAR DIMENSIONS))))
              (BQUOTE (SATISFIES
                       (LAMBDA (X)
                         (AND (CL:ARRAYP X)
                              (EQL (ARRAY-RANK X)
                                   (\, (CL:LENGTH DIMENSIONS)))
                              (\,@ (CL:DO ((DIMSPEC DIMENSIONS (CDR DIMSPEC))
                                           (DIM 0 (1+ DIM))
                                           FORMS)
                                          ((NULL DIMSPEC)
                                           FORMS)
                                          (CL:IF (NOT (EQL (CAR DIMSPEC)
                                                           (QUOTE CL:*)))
                                                 (CL:PUSH (BQUOTE (EQL (ARRAY-DIMENSION X
                                                                              (\, DIM))
                                                                       (\, (CAR DIMSPEC))))
                                                        FORMS))))
                              (\,@ (CL:IF (NOT (EQ ELEMENT-TYPE (QUOTE CL:*)))
                                          (BQUOTE ((EQUAL (ARRAY-ELEMENT-TYPE X)
                                                          (QUOTE (\, ELEMENT-TYPE)))))))))))))
      (T (CL:ERROR "Bad (final) array type designator: ~S" (BQUOTE (ARRAY (\, ELEMENT-TYPE)
                                                                          (\, DIMENSIONS)))))))

(DEFTYPE VECTOR (&OPTIONAL ELEMENT-TYPE SIZE)
   (COND
      ((EQ ELEMENT-TYPE (QUOTE CL:*))
       (CL:IF (EQ SIZE (QUOTE CL:*))
              (QUOTE (SATISFIES VECTORP))
              (BQUOTE (SATISFIES (LAMBDA (V)
                                   (AND (VECTORP V)
                                        (EQL (ARRAY-TOTAL-SIZE V)
                                             (\, SIZE))))))))
      ((EQ ELEMENT-TYPE (QUOTE STRING-CHAR))
       (BQUOTE (STRING (\, SIZE))))
      ((MEMBER ELEMENT-TYPE (QUOTE (BIT (UNSIGNED-BYTE 1))))
       (BQUOTE (BIT-VECTOR (\, SIZE))))
      (T (BQUOTE (SATISFIES (LAMBDA (V)
                              (AND (VECTORP V)
                                   (EQUAL (ARRAY-ELEMENT-TYPE V)
                                          (QUOTE (\, (%%GET-CANONICAL-CML-TYPE ELEMENT-TYPE))))
                                   (\,@ (CL:IF (NOT (EQ SIZE (QUOTE CL:*)))
                                               (BQUOTE ((EQL (ARRAY-TOTAL-SIZE V)
                                                             (\, SIZE)))))))))))))

(DEFTYPE SIMPLE-STRING (&OPTIONAL SIZE) (CL:IF (EQ SIZE (QUOTE CL:*))
                                               (BQUOTE (SATISFIES SIMPLE-STRING-P))
                                               (BQUOTE (SATISFIES (LAMBDA (V)
                                                                    (AND (SIMPLE-STRING-P V)
                                                                         (EQL (ARRAY-TOTAL-SIZE
                                                                               V)
                                                                              (\, SIZE))))))))

(DEFTYPE STRING (&OPTIONAL SIZE) (CL:IF (EQ SIZE (QUOTE CL:*))
                                        (QUOTE (SATISFIES CL:STRINGP))
                                        (BQUOTE (SATISFIES (LAMBDA (X)
                                                             (AND (CL:STRINGP X)
                                                                  (EQL (ARRAY-TOTAL-SIZE X)
                                                                       (\, SIZE))))))))

(DEFTYPE SIMPLE-ARRAY (&OPTIONAL ELEMENT-TYPE DIMENSIONS) "Simple-array type expander"
   (CL:IF (TYPEP DIMENSIONS (QUOTE FIXNUM))
          (SETQ DIMENSIONS (MAKE-LIST DIMENSIONS :INITIAL-ELEMENT (QUOTE CL:*))))
   (CL:IF (NOT (EQ ELEMENT-TYPE (QUOTE CL:*)))
          (SETQ ELEMENT-TYPE (%%GET-CANONICAL-CML-TYPE ELEMENT-TYPE)))
   (COND
      ((EQ DIMENSIONS (QUOTE CL:*))
       (CL:IF (EQ ELEMENT-TYPE (QUOTE CL:*))
              (QUOTE (SATISFIES SIMPLE-ARRAY-P))
              (BQUOTE (SATISFIES (LAMBDA (X)
                                   (AND (SIMPLE-ARRAY-P X)
                                        (EQUAL (ARRAY-ELEMENT-TYPE X)
                                               (QUOTE (\, ELEMENT-TYPE)))))))))
      ((EQUAL DIMENSIONS (QUOTE (CL:*)))
       (COND
          ((EQ ELEMENT-TYPE (QUOTE STRING-CHAR))
           (QUOTE SIMPLE-STRING))
          ((OR (EQ ELEMENT-TYPE (QUOTE BIT))
               (EQUAL ELEMENT-TYPE (QUOTE (UNSIGNED-BYTE 1))))
           (QUOTE SIMPLE-BIT-VECTOR))
          ((EQ ELEMENT-TYPE T)
           (QUOTE SIMPLE-VECTOR))
          (T (BQUOTE (SATISFIES (LAMBDA (X)
                                  (AND (SIMPLE-ARRAY-P X)
                                       (EQL 1 (ARRAY-RANK X))
                                       (\,@ (CL:IF (NOT (EQ ELEMENT-TYPE (QUOTE CL:*)))
                                                   (BQUOTE ((EQUAL (ARRAY-ELEMENT-TYPE X)
                                                                   (QUOTE (\, ELEMENT-TYPE)))))))))))
             )))
      ((DOLIST (DIM DIMENSIONS T)
              (CL:IF (NOT (EQ DIM (QUOTE CL:*)))
                     (RETURN NIL)))
       (BQUOTE (SATISFIES (LAMBDA (X)
                            (AND (SIMPLE-ARRAY-P X)
                                 (EQL (ARRAY-RANK X)
                                      (\, (CL:LENGTH DIMENSIONS)))
                                 (\,@ (CL:IF (NOT (EQ ELEMENT-TYPE (QUOTE CL:*)))
                                             (BQUOTE ((EQUAL (ARRAY-ELEMENT-TYPE X)
                                                             (QUOTE (\, ELEMENT-TYPE))))))))))))
      ((DOLIST (DIM DIMENSIONS T)
              (CL:IF (NOT (OR (EQ DIM (QUOTE CL:*))
                              (TYPEP DIM (QUOTE FIXNUM))))
                     (RETURN NIL)))
       (BQUOTE (SATISFIES (LAMBDA (X)
                            (AND (SIMPLE-ARRAY-P X)
                                 (EQL (ARRAY-RANK X)
                                      (\, (CL:LENGTH DIMENSIONS)))
                                 (\,@ (CL:DO ((DIMSPEC DIMENSIONS (CDR DIMSPEC))
                                              (DIM 0 (1+ DIM))
                                              FORMS)
                                             ((NULL DIMSPEC)
                                              FORMS)
                                             (CL:IF (NOT (EQL (CAR DIMSPEC)
                                                              (QUOTE CL:*)))
                                                    (CL:PUSH (BQUOTE (EQL (ARRAY-DIMENSION
                                                                           X
                                                                           (\, DIM))
                                                                          (\, (CAR DIMSPEC))))
                                                           FORMS))))
                                 (\,@ (CL:IF (NOT (EQ ELEMENT-TYPE (QUOTE CL:*)))
                                             (BQUOTE ((EQUAL (ARRAY-ELEMENT-TYPE X)
                                                             (QUOTE (\, ELEMENT-TYPE))))))))))))
      (T (CL:ERROR "Bad (final) array type designator: ~S" (BQUOTE (SIMPLE-ARRAY (\, ELEMENT-TYPE)
                                                                          (\, DIMENSIONS)))))))

(DEFTYPE SIMPLE-VECTOR (&OPTIONAL SIZE) (CL:IF (EQ SIZE (QUOTE CL:*))
                                               (BQUOTE (SATISFIES SIMPLE-VECTOR-P))
                                               (BQUOTE (SATISFIES (LAMBDA (V)
                                                                    (AND (SIMPLE-VECTOR-P V)
                                                                         (EQL (ARRAY-TOTAL-SIZE
                                                                               V)
                                                                              (\, SIZE))))))))

(DEFTYPE BIT-VECTOR (&OPTIONAL SIZE) (CL:IF (EQ SIZE (QUOTE CL:*))
                                            (BQUOTE (SATISFIES BIT-VECTOR-P))
                                            (BQUOTE (SATISFIES (LAMBDA (V)
                                                                 (AND (BIT-VECTOR-P V)
                                                                      (EQL (ARRAY-TOTAL-SIZE V)
                                                                           (\, SIZE))))))))

(DEFTYPE SIMPLE-BIT-VECTOR (&OPTIONAL SIZE) (CL:IF (EQ SIZE (QUOTE CL:*))
                                                   (BQUOTE (SATISFIES SIMPLE-BIT-VECTOR-P))
                                                   (BQUOTE (SATISFIES (LAMBDA (V)
                                                                        (AND (SIMPLE-BIT-VECTOR-P
                                                                              V)
                                                                             (EQL (ARRAY-TOTAL-SIZE
                                                                                   V)
                                                                                  (\, SIZE))))))))

(* * for TYPE-OF - Interlisp types that have different common Lisp names)


(PUTPROPS CHARACTER CMLTYPE CL:CHARACTER)

(PUTPROPS FIXP CMLTYPE BIGNUM)

(PUTPROPS FLOATP CMLTYPE SINGLE-FLOAT)

(PUTPROPS GENERAL-ARRAY CMLTYPE ARRAY)

(PUTPROPS LISTP CMLTYPE CONS)

(PUTPROPS LITATOM CMLTYPE SYMBOL)

(PUTPROPS ONED-ARRAY CMLTYPE ARRAY)

(PUTPROPS SMALLP CMLTYPE FIXNUM)

(PUTPROPS STRINGP CMLTYPE SIMPLE-STRING)

(PUTPROPS HARRAYP CMLTYPE HASH-ARRAY)

(PUTPROPS TWOD-ARRAY CMLTYPE ARRAY)

(PUTPROPS SYMBOL CMLSUBTYPEDESCRIMINATOR SYMBOL-TYPE)

(PUTPROPS ARRAY CMLSUBTYPEDESCRIMINATOR ARRAY-TYPE)
(* * What's this for?)


(PUTPROPS DEFTYPE PROPTYPE IGNORE)
(* * Compiler options)


(PUTPROPS CMLTYPES FILETYPE COMPILE-FILE)
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY 
(DECLARE: DOEVAL@COMPILE DONTCOPY

(LOCALVARS . T)
)
)
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML )

(ADDTOVAR LAMA )
)
(PUTPROPS CMLTYPES COPYRIGHT ("Xerox Corporation" 1985 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (8250 16858 (ARRAY-TYPE 8260 . 10319) (FALSE 10321 . 10351) (SYMBOL-TYPE 10353 . 10544) 
(TRUE 10546 . 10573) (\RANGE.TYPE 10575 . 14048) (\TYPEP.EXPAND.MACRO 14050 . 14244) (\TYPEP.PRED 
14246 . 16856)))))
STOP