(FILECREATED " 5-Sep-86 17:37:39" {ERIS}<LISPCORE>LIBRARY>CMLSEQBASICS.;4 18953 changes to: (VARS CMLSEQBASICSCOMS) (FUNCTIONS NREVERSE) previous date: "11-Aug-86 16:22:57" {ERIS}<LISPCORE>LIBRARY>CMLSEQBASICS.;3) (* Copyright (c) 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT CMLSEQBASICSCOMS) (RPAQQ CMLSEQBASICSCOMS ((DECLARE: EVAL@COMPILE DONTCOPY (FILES CMLSEQCOMMON)) (FUNCTIONS CHECK-SUBSEQ MAKE-SEQUENCE-OF-TYPE) (COMS (FUNCTIONS CL:ELT %%SETELT) (SETFS CL:ELT)) (COMS (FUNCTIONS SUBSEQ LIST-SUBSEQ* VECTOR-SUBSEQ*) (SETFS SUBSEQ)) (FUNCTIONS COPY-SEQ LIST-COPY-SEQ LIST-COPY-SEQ* VECTOR-COPY-SEQ VECTOR-COPY-SEQ*) (FUNCTIONS CL:LENGTH) (FUNCTIONS CL:REVERSE LIST-REVERSE-MACRO VECTOR-REVERSE VECTOR-REVERSE*) (FUNCTIONS NREVERSE LIST-NREVERSE-MACRO LIST-NREVERSE* VECTOR-NREVERSE VECTOR-NREVERSE*) (FUNCTIONS MAKE-SEQUENCE) (FUNCTIONS CONCATENATE CONCATENATE-TO-LIST CONCAT-TO-LIST* CONCAT-TO-SIMPLE* ) (PROPS (CMLSEQBASICS FILETYPE)))) (DECLARE: EVAL@COMPILE DONTCOPY (FILESLOAD CMLSEQCOMMON) ) (DEFUN CHECK-SUBSEQ (SEQ START END LENGTH) (COND ((CL:ZEROP LENGTH)) ((OR (< START 0) (>= START LENGTH)) (CL:ERROR "Index out of range: ~D." START)) ((OR (< END 0) (> END LENGTH)) (CL:ERROR "Index out of range: ~D." END)) ((< END START) (CL:ERROR "Illegal subsequence:~&START (~D) may not be greater than END (~D)." START END)))) (DEFUN MAKE-SEQUENCE-OF-TYPE (TYPE LENGTH) (* raf "27-Jan-86 17:30") (CASE (TYPE-SPECIFIER TYPE) (LIST (MAKE-LIST LENGTH)) ((BIT-VECTOR SIMPLE-BIT-VECTOR) (MAKE-ARRAY LENGTH :ELEMENT-TYPE (QUOTE BIT))) ((STRING SIMPLE-STRING) (MAKE-STRING LENGTH)) (SIMPLE-VECTOR (MAKE-ARRAY LENGTH)) ((ARRAY SIMPLE-ARRAY VECTOR) (CL:IF (CL:LISTP TYPE) (MAKE-ARRAY LENGTH :ELEMENT-TYPE (CADR TYPE)) (MAKE-ARRAY LENGTH))) (T (CL:ERROR "~S is a bad type specifier for sequence functions." TYPE)))) (DEFUN CL:ELT (SEQUENCE INDEX) (* amd " 5-Jun-86 17:48") (CL:WHEN (< INDEX 0) (CL:ERROR (QUOTE INDEX-BOUNDS-ERROR) :NAME SEQUENCE :INDEX INDEX)) (SEQ-DISPATCH SEQUENCE (CL:DO ((COUNT INDEX (1- COUNT))) ((= COUNT 0) (CL:IF (ENDP SEQUENCE) (CL:ERROR (QUOTE INDEX-BOUNDS-ERROR) :NAME SEQUENCE :INDEX INDEX) (CAR SEQUENCE))) (CL:IF (ENDP SEQUENCE) (CL:ERROR (QUOTE INDEX-BOUNDS-ERROR) :NAME SEQUENCE :INDEX INDEX) (CL:POP SEQUENCE))) (CL:IF (>= INDEX (CL:LENGTH (THE VECTOR SEQUENCE))) (CL:ERROR (QUOTE INDEX-BOUNDS-ERROR) :NAME SEQUENCE :INDEX INDEX) (AREF SEQUENCE INDEX)))) (DEFUN %%SETELT (SEQUENCE INDEX NEWVAL) (* raf "27-Jan-86 17:30") (CL:WHEN (< INDEX 0) (CL:ERROR (QUOTE INDEX-BOUNDS-ERROR) :NAME SEQUENCE :INDEX INDEX)) (SEQ-DISPATCH SEQUENCE (CL:DO ((COUNT INDEX (1- COUNT)) (SEQ SEQUENCE)) ((= COUNT 0) (CL:IF (ENDP SEQ) (CL:ERROR (QUOTE INDEX-BOUNDS-ERROR) :NAME SEQUENCE :INDEX INDEX) (RPLACA SEQ NEWVAL)) NEWVAL) (CL:IF (ENDP (CDR SEQ)) (CL:ERROR (QUOTE INDEX-BOUNDS-ERROR) :NAME SEQUENCE :INDEX INDEX) (CL:POP SEQ))) (CL:IF (>= INDEX (CL:LENGTH (THE VECTOR SEQUENCE))) (CL:ERROR (QUOTE INDEX-BOUNDS-ERROR) :NAME SEQUENCE :INDEX INDEX) (SETF (AREF SEQUENCE INDEX) NEWVAL)))) (DEFSETF CL:ELT %%SETELT) (DEFUN SUBSEQ (SEQUENCE START &OPTIONAL END) (* amd " 2-May-86 13:41") (CL:IF (< START 0) (CL:ERROR "Index out of range: ~D." START) (SEQ-DISPATCH SEQUENCE (LIST-SUBSEQ* SEQUENCE START END) (VECTOR-SUBSEQ* SEQUENCE START END)))) (DEFUN LIST-SUBSEQ* (SEQUENCE START END) (DECLARE (TYPE LIST SEQUENCE)) (* amd " 2-May-86 13:40") (COND ((AND END (> START END)) (CL:ERROR "Illegal subsequence:~&START (~D) may not be greater than END (~D)." START END)) ((NULL SEQUENCE) NIL) ((AND END (= START END)) (CL:IF (>= START (CL:LENGTH SEQUENCE)) (CL:ERROR "Index out of range: ~D." START) (RETURN-FROM LIST-SUBSEQ* NIL))) (T (LET* ((GROVELED (NTHCDR START SEQUENCE)) (RESULT (LIST (CAR GROVELED)))) (CL:IF GROVELED (CL:DO ((LIST (CDR GROVELED) (CDR LIST)) (SPLICE RESULT (CDR (RPLACD SPLICE (LIST (CAR LIST))))) (INDEX (1+ START) (1+ INDEX))) ((OR (ENDP LIST) (AND END (>= INDEX END))) (CL:IF (OR (NULL END) (= INDEX END)) RESULT (CL:ERROR "Index out of range: ~D." END)))) (CL:ERROR "Index out of range: ~D." START)))))) (DEFUN VECTOR-SUBSEQ* (SEQUENCE START END &AUX (LENGTH (CL:LENGTH SEQUENCE))) (DECLARE (TYPE VECTOR SEQUENCE)) (* amd " 2-May-86 13:40") (CL:UNLESS END (SETQ END LENGTH)) (COND ((< END START) (CL:ERROR "Illegal subsequence:~&START (~D) may not be greater than END (~D)." START END)) ((CL:ZEROP LENGTH) (COPY-SEQ SEQUENCE)) ((>= START LENGTH) (CL:ERROR "Index out of range: ~D." START)) (T (CL:DO ((OLD-INDEX START (1+ OLD-INDEX)) (NEW-INDEX 0 (1+ NEW-INDEX)) (COPY (MAKE-SEQUENCE-LIKE SEQUENCE (- END START)))) ((>= OLD-INDEX END) COPY) (SETF (AREF COPY NEW-INDEX) (AREF SEQUENCE OLD-INDEX)))))) (DEFSETF SUBSEQ (SEQUENCE START &OPTIONAL END) (NEW-SEQUENCE) (BQUOTE (PROGN (CL:REPLACE (\, SEQUENCE) (\, NEW-SEQUENCE) :START1 (\, START) :END1 (\, END)) (\, NEW-SEQUENCE)))) (DEFUN COPY-SEQ (SEQUENCE) "Returns a copy of SEQUENCE which is EQUALP to SEQUENCE but not EQ." (SEQ-DISPATCH SEQUENCE (LIST-COPY-SEQ* SEQUENCE) (VECTOR-COPY-SEQ* SEQUENCE))) (DEFMACRO LIST-COPY-SEQ (LIST) (BQUOTE (APPEND (\, LIST)))) (DEFUN LIST-COPY-SEQ* (SEQUENCE) (LIST-COPY-SEQ SEQUENCE)) (DEFMACRO VECTOR-COPY-SEQ (SEQUENCE TYPE) (BQUOTE (LET ((LENGTH (CL:LENGTH (THE VECTOR (\, SEQUENCE)) ))) (CL:DO ((INDEX 0 (1+ INDEX)) (COPY (MAKE-SEQUENCE-OF-TYPE (\, TYPE) LENGTH))) ((= INDEX LENGTH) COPY) (SETF (AREF COPY INDEX) (AREF (\, SEQUENCE) INDEX)))))) (DEFUN VECTOR-COPY-SEQ* (SEQUENCE) (VECTOR-COPY-SEQ SEQUENCE (TYPE-OF SEQUENCE))) (DEFUN CL:LENGTH (SEQUENCE) (* lmm "25-Feb-86 13:06") (SEQ-DISPATCH SEQUENCE (LENGTH SEQUENCE) (CL:IF (ARRAY-HAS-FILL-POINTER-P (THE VECTOR SEQUENCE)) (FILL-POINTER SEQUENCE) (ARRAY-TOTAL-SIZE SEQUENCE)))) (DEFUN CL:REVERSE (SEQUENCE) "Returns a new sequence containing the same elements but in reverse order." (SEQ-DISPATCH SEQUENCE (REVERSE SEQUENCE) (VECTOR-REVERSE* SEQUENCE))) (DEFMACRO LIST-REVERSE-MACRO (SEQUENCE) (BQUOTE (CL:DO ((NEW-LIST NIL)) ((ENDP (\, SEQUENCE)) NEW-LIST) (CL:PUSH (CL:POP (\, SEQUENCE)) NEW-LIST)))) (DEFMACRO VECTOR-REVERSE (SEQUENCE TYPE) (BQUOTE (LET ((LENGTH (CL:LENGTH (\, SEQUENCE)))) (CL:DO ((FORWARD-INDEX 0 (1+ FORWARD-INDEX)) (BACKWARD-INDEX (1- LENGTH) (1- BACKWARD-INDEX)) (NEW-SEQUENCE (MAKE-SEQUENCE-OF-TYPE (\, TYPE) LENGTH))) ((= FORWARD-INDEX LENGTH) NEW-SEQUENCE) (SETF (AREF NEW-SEQUENCE FORWARD-INDEX) (AREF (\, SEQUENCE) BACKWARD-INDEX)))))) (DEFUN VECTOR-REVERSE* (SEQUENCE) (* raf "18-Dec-85 00:07") (VECTOR-REVERSE SEQUENCE (TYPE-OF SEQUENCE))) (DEFUN NREVERSE (SEQUENCE) "Returns a sequence of the same elements in reverse order (the argument is destroyed)." (* kbr: "31-Aug-85 17:57") (SEQ-DISPATCH SEQUENCE (DREVERSE SEQUENCE) (VECTOR-NREVERSE* SEQUENCE))) (DEFMACRO LIST-NREVERSE-MACRO (LIST) (BQUOTE (CL:DO ((1ST (CDR (\, LIST)) (COND ((ENDP 1ST) 1ST) (T (CDR 1ST)))) (2ND (\, LIST) 1ST) (3RD (QUOTE NIL) 2ND)) ((ENDP 2ND) 3RD) (RPLACD 2ND 3RD)))) (DEFUN LIST-NREVERSE* (SEQUENCE) (LIST-NREVERSE-MACRO SEQUENCE)) (DEFMACRO VECTOR-NREVERSE (SEQUENCE) (BQUOTE (LET ((LENGTH (CL:LENGTH (THE VECTOR (\, SEQUENCE))))) (CL:DO ((LEFT-INDEX 0 (1+ LEFT-INDEX)) (RIGHT-INDEX (1- LENGTH) (1- RIGHT-INDEX)) (HALF-LENGTH (IQUOTIENT LENGTH 2))) ((= LEFT-INDEX HALF-LENGTH) (\, SEQUENCE)) (ROTATEF (AREF (\, SEQUENCE) LEFT-INDEX) (AREF (\, SEQUENCE) RIGHT-INDEX)))))) (DEFUN VECTOR-NREVERSE* (SEQUENCE) (VECTOR-NREVERSE SEQUENCE)) (DEFUN MAKE-SEQUENCE (TYPE LENGTH &KEY INITIAL-ELEMENT) (* raf "27-Jan-86 17:30") (CASE (TYPE-SPECIFIER TYPE) (LIST (MAKE-LIST LENGTH :INITIAL-ELEMENT INITIAL-ELEMENT)) ((SIMPLE-STRING STRING) (LET ((STRING (MAKE-STRING LENGTH))) (CL:WHEN INITIAL-ELEMENT (CL:DO ((INDEX 0 (1+ INDEX))) ((= INDEX LENGTH) STRING) (SETF (CHAR (THE SIMPLE-STRING STRING) INDEX) INITIAL-ELEMENT))) STRING)) (SIMPLE-VECTOR (MAKE-ARRAY LENGTH :INITIAL-ELEMENT INITIAL-ELEMENT)) ((ARRAY VECTOR SIMPLE-ARRAY) (CL:IF (CL:LISTP TYPE) (MAKE-ARRAY LENGTH :ELEMENT-TYPE (CADR TYPE) :INITIAL-ELEMENT INITIAL-ELEMENT) (MAKE-ARRAY LENGTH :INITIAL-ELEMENT INITIAL-ELEMENT))) ((BIT-VECTOR SIMPLE-BIT-VECTOR) (MAKE-ARRAY LENGTH :ELEMENT-TYPE (QUOTE (MOD 2)) :INITIAL-ELEMENT INITIAL-ELEMENT)) (T (CL:ERROR "~S is a bad type specifier for sequences." TYPE)))) (DEFUN CONCATENATE (RESULT-TYPE &REST SEQUENCES) (* kbr: "31-Aug-85 19:50") (* "This should be (subtypep result-type 'sequence)") (CASE (TYPE-SPECIFIER RESULT-TYPE) (LIST (CL:APPLY (FUNCTION CONCAT-TO-LIST*) SEQUENCES)) ((SIMPLE-VECTOR SIMPLE-STRING VECTOR STRING ARRAY SIMPLE-ARRAY BIT-VECTOR SIMPLE-BIT-VECTOR) (CL:APPLY (FUNCTION CONCAT-TO-SIMPLE*) RESULT-TYPE SEQUENCES)) (T (CL:ERROR "~S: invalid output type specification." RESULT-TYPE)))) (DEFMACRO CONCATENATE-TO-LIST (SEQUENCES) (BQUOTE (LET ((RESULT (LIST NIL))) (CL:DO ((SEQUENCES (\, SEQUENCES) (CDR SEQUENCES)) (SPLICE RESULT)) ((NULL SEQUENCES) (CDR RESULT)) (LET ((SEQUENCE (CAR SEQUENCES))) (SEQ-DISPATCH SEQUENCE (CL:DO ((SEQUENCE SEQUENCE (CDR SEQUENCE))) ((ENDP SEQUENCE)) (SETQ SPLICE (CDR (RPLACD SPLICE (CONS (CAR SEQUENCE) NIL))))) (CL:DO ((INDEX 0 (1+ INDEX)) (LENGTH (CL:LENGTH SEQUENCE))) ((= INDEX LENGTH)) (SETQ SPLICE (CDR (RPLACD SPLICE (CONS (AREF SEQUENCE INDEX ) NIL))))))))))) (DEFUN CONCAT-TO-LIST* (&REST SEQUENCES) (CONCATENATE-TO-LIST SEQUENCES)) (DEFUN CONCAT-TO-SIMPLE* (RESULT-TYPE &REST SEQUENCES) (* kbr: " 1-Sep-85 19:21") (CL:DO ((SEQS SEQUENCES (CDR SEQS)) (TOTAL-LENGTH 0) (LENGTHS NIL)) ((NULL SEQS) (CL:DO ((SEQUENCES SEQUENCES (CDR SEQUENCES)) (LENGTHS (REVERSE LENGTHS) (CDR LENGTHS)) (INDEX 0) (RESULT (MAKE-SEQUENCE-OF-TYPE RESULT-TYPE TOTAL-LENGTH))) ((= INDEX TOTAL-LENGTH) RESULT) (LET ((SEQUENCE (CAR SEQUENCES))) (SEQ-DISPATCH SEQUENCE (CL:DO ((SEQUENCE SEQUENCE (CDR SEQUENCE))) ((ENDP SEQUENCE)) (SETF (AREF RESULT INDEX) (CAR SEQUENCE)) (INCF INDEX)) (CL:DO ((JNDEX 0 (1+ JNDEX))) ((= JNDEX (CAR LENGTHS))) (SETF (AREF RESULT INDEX) (AREF SEQUENCE JNDEX)) (INCF INDEX)))))) (LET ((LENGTH (CL:LENGTH (CAR SEQS)))) (CL:PUSH LENGTH LENGTHS) (INCF TOTAL-LENGTH LENGTH)))) (PUTPROPS CMLSEQBASICS FILETYPE COMPILE-FILE) (PUTPROPS CMLSEQBASICS COPYRIGHT ("Xerox Corporation" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP