(FILECREATED "16-Jul-86 01:24:59" {ERIS}<LISPCORE>EVAL>CMLSEQMODIFY.;1 64131  

      changes to:  (FUNCTIONS VECTOR-SUBSTITUTE*)

      previous date: " 2-Jul-86 18:08:00" {ERIS}<LISPCORE>LIBRARY>CMLSEQMODIFY.;1)


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

(PRETTYCOMPRINT CMLSEQMODIFYCOMS)

(RPAQQ CMLSEQMODIFYCOMS ((DECLARE: EVAL@COMPILE DONTCOPY (FILES CMLSEQCOMMON))
                         (FUNCTIONS FILL LIST-FILL LIST-FILL* VECTOR-FILL VECTOR-FILL*)
                         (FUNCTIONS MUMBLE-REPLACE-FROM-MUMBLE LIST-REPLACE-FROM-LIST 
                                LIST-REPLACE-FROM-MUMBLE MUMBLE-REPLACE-FROM-LIST CL:REPLACE 
                                LIST-REPLACE-FROM-LIST* LIST-REPLACE-FROM-VECTOR* 
                                VECTOR-REPLACE-FROM-LIST* VECTOR-REPLACE-FROM-VECTOR*)
                         (COMS (FUNCTIONS MUMBLE-DELETE MUMBLE-DELETE-FROM-END LIST-DELETE 
                                      LIST-DELETE-FROM-END)
                               (FUNCTIONS NORMAL-MUMBLE-DELETE NORMAL-MUMBLE-DELETE-FROM-END 
                                      NORMAL-LIST-DELETE NORMAL-LIST-DELETE-FROM-END CL:DELETE)
                               (FUNCTIONS IF-MUMBLE-DELETE IF-MUMBLE-DELETE-FROM-END IF-LIST-DELETE 
                                      IF-LIST-DELETE-FROM-END DELETE-IF)
                               (FUNCTIONS IF-NOT-MUMBLE-DELETE IF-NOT-MUMBLE-DELETE-FROM-END 
                                      IF-NOT-LIST-DELETE IF-NOT-LIST-DELETE-FROM-END DELETE-IF-NOT))
                         (COMS (FUNCTIONS MUMBLE-REMOVE-MACRO MUMBLE-REMOVE MUMBLE-REMOVE-FROM-END 
                                      LIST-REMOVE-MACRO LIST-REMOVE LIST-REMOVE-FROM-END)
                               (FUNCTIONS NORMAL-MUMBLE-REMOVE NORMAL-MUMBLE-REMOVE-FROM-END 
                                      NORMAL-LIST-REMOVE NORMAL-LIST-REMOVE-FROM-END CL:REMOVE)
                               (FUNCTIONS IF-MUMBLE-REMOVE IF-MUMBLE-REMOVE-FROM-END IF-LIST-REMOVE 
                                      IF-LIST-REMOVE-FROM-END REMOVE-IF)
                               (FUNCTIONS IF-NOT-MUMBLE-REMOVE IF-NOT-MUMBLE-REMOVE-FROM-END 
                                      IF-NOT-LIST-REMOVE IF-NOT-LIST-REMOVE-FROM-END REMOVE-IF-NOT))
                         (FUNCTIONS LIST-REMOVE-DUPLICATES* VECTOR-REMOVE-DUPLICATES* 
                                REMOVE-DUPLICATES LIST-DELETE-DUPLICATES* VECTOR-DELETE-DUPLICATES* 
                                DELETE-DUPLICATES)
                         (FUNCTIONS SUBST-DISPATCH LIST-SUBSTITUTE* VECTOR-SUBSTITUTE* SUBSTITUTE 
                                SUBSTITUTE-IF SUBSTITUTE-IF-NOT)
                         (FUNCTIONS NLIST-SUBSTITUTE* NVECTOR-SUBSTITUTE* NSUBSTITUTE 
                                NLIST-SUBSTITUTE-IF* NVECTOR-SUBSTITUTE-IF* NSUBSTITUTE-IF 
                                NLIST-SUBSTITUTE-IF-NOT* NVECTOR-SUBSTITUTE-IF-NOT* 
                                NSUBSTITUTE-IF-NOT)
                         (PROP FILETYPE CMLSEQMODIFY)))
(DECLARE: EVAL@COMPILE DONTCOPY 
(FILESLOAD CMLSEQCOMMON)
)
(DEFUN FILL (SEQUENCE ITEM &KEY (START 0)
                   END &AUX (LENGTH (CL:LENGTH SEQUENCE))) 
                                              "Replace the specified elements of SEQUENCE with ITEM."
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (SEQ-DISPATCH SEQUENCE (LIST-FILL* SEQUENCE ITEM START END)
          (VECTOR-FILL* SEQUENCE ITEM START END)))

(DEFMACRO LIST-FILL (SEQUENCE ITEM START END) (BQUOTE (CL:DO ((CURRENT (NTHCDR (\, START)
                                                                              (\, SEQUENCE))
                                                                     (CDR CURRENT))
                                                              (INDEX (\, START)
                                                                     (1+ INDEX)))
                                                             ((OR (ENDP CURRENT)
                                                                  (>= INDEX (\, END)))
                                                              SEQUENCE)
                                                             (RPLACA CURRENT (\, ITEM)))))

(DEFUN LIST-FILL* (SEQUENCE ITEM START END)                  (* raf "17-Dec-85 22:37") (LIST-FILL
                                                                                        SEQUENCE ITEM 
                                                                                        START END))

(DEFMACRO VECTOR-FILL (SEQUENCE ITEM START END) (BQUOTE (CL:DO ((INDEX (\, START)
                                                                       (1+ INDEX)))
                                                               ((>= INDEX (\, END))
                                                                (\, SEQUENCE))
                                                               (SETF (AREF (\, SEQUENCE)
                                                                           INDEX)
                                                                     (\, ITEM)))))

(DEFUN VECTOR-FILL* (SEQUENCE ITEM START END)                (* raf "17-Dec-85 22:37") (VECTOR-FILL
                                                                                        SEQUENCE ITEM 
                                                                                        START END))

(DEFMACRO MUMBLE-REPLACE-FROM-MUMBLE NIL (BQUOTE (CL:IF (AND (EQ TARGET-SEQUENCE SOURCE-SEQUENCE)
                                                             (> TARGET-START SOURCE-START))
                                                        (LET ((NELTS (MIN (- TARGET-END TARGET-START)
                                                                          (- SOURCE-END SOURCE-START)
                                                                          )))
                                                             (CL:DO ((TARGET-INDEX (+ TARGET-START 
                                                                                      NELTS -1)
                                                                            (1- TARGET-INDEX))
                                                                     (SOURCE-INDEX (+ SOURCE-START 
                                                                                      NELTS -1)
                                                                            (1- SOURCE-INDEX)))
                                                                    ((< TARGET-INDEX TARGET-START)
                                                                     TARGET-SEQUENCE)
                                                                    (SETF (AREF TARGET-SEQUENCE 
                                                                                TARGET-INDEX)
                                                                          (AREF SOURCE-SEQUENCE 
                                                                                SOURCE-INDEX))))
                                                        (CL:DO ((TARGET-INDEX TARGET-START
                                                                       (1+ TARGET-INDEX))
                                                                (SOURCE-INDEX SOURCE-START
                                                                       (1+ SOURCE-INDEX)))
                                                               ((OR (>= TARGET-INDEX TARGET-END)
                                                                    (>= SOURCE-INDEX SOURCE-END))
                                                                TARGET-SEQUENCE)
                                                               (SETF (AREF TARGET-SEQUENCE 
                                                                           TARGET-INDEX)
                                                                     (AREF SOURCE-SEQUENCE 
                                                                           SOURCE-INDEX))))))

(DEFMACRO LIST-REPLACE-FROM-LIST NIL (BQUOTE (COND
                                                ((AND (EQ TARGET-SEQUENCE SOURCE-SEQUENCE)
                                                      (> TARGET-START SOURCE-START))
                                                 (LET ((NEW-ELTS (SUBSEQ SOURCE-SEQUENCE SOURCE-START
                                                                        (+ SOURCE-START
                                                                           (MIN (- TARGET-END 
                                                                                   TARGET-START)
                                                                                (- SOURCE-END 
                                                                                   SOURCE-START))))))
                                                      (CL:DO ((N NEW-ELTS (CDR N))
                                                              (O (NTHCDR TARGET-START TARGET-SEQUENCE
                                                                        )
                                                                 (CDR O)))
                                                             ((ENDP N)
                                                              TARGET-SEQUENCE)
                                                             (RPLACA O (CAR N)))))
                                                (T (CL:DO ((TARGET-INDEX TARGET-START (1+ 
                                                                                         TARGET-INDEX
                                                                                          ))
                                                           (SOURCE-INDEX SOURCE-START (1+ 
                                                                                         SOURCE-INDEX
                                                                                          ))
                                                           (TARGET-SEQUENCE-REF (NTHCDR TARGET-START 
                                                                                      TARGET-SEQUENCE
                                                                                       )
                                                                  (CDR TARGET-SEQUENCE-REF))
                                                           (SOURCE-SEQUENCE-REF (NTHCDR SOURCE-START 
                                                                                      SOURCE-SEQUENCE
                                                                                       )
                                                                  (CDR SOURCE-SEQUENCE-REF)))
                                                          ((OR (>= TARGET-INDEX TARGET-END)
                                                               (>= SOURCE-INDEX SOURCE-END)
                                                               (NULL TARGET-SEQUENCE-REF)
                                                               (NULL SOURCE-SEQUENCE-REF))
                                                           TARGET-SEQUENCE)
                                                          (RPLACA TARGET-SEQUENCE-REF (CAR 
                                                                                  SOURCE-SEQUENCE-REF
                                                                                           )))))))

(DEFMACRO LIST-REPLACE-FROM-MUMBLE NIL (BQUOTE (CL:DO ((TARGET-INDEX TARGET-START (1+ TARGET-INDEX))
                                                       (SOURCE-INDEX SOURCE-START (1+ SOURCE-INDEX))
                                                       (TARGET-SEQUENCE-REF (NTHCDR TARGET-START 
                                                                                   TARGET-SEQUENCE)
                                                              (CDR TARGET-SEQUENCE-REF)))
                                                      ((OR (>= TARGET-INDEX TARGET-END)
                                                           (>= SOURCE-INDEX SOURCE-END)
                                                           (ENDP TARGET-SEQUENCE-REF))
                                                       TARGET-SEQUENCE)
                                                      (RPLACA TARGET-SEQUENCE-REF (AREF 
                                                                                      SOURCE-SEQUENCE 
                                                                                        SOURCE-INDEX)
                                                             ))))

(DEFMACRO MUMBLE-REPLACE-FROM-LIST NIL (BQUOTE (CL:DO ((TARGET-INDEX TARGET-START (1+ TARGET-INDEX))
                                                       (SOURCE-INDEX SOURCE-START (1+ SOURCE-INDEX))
                                                       (SOURCE-SEQUENCE (NTHCDR SOURCE-START 
                                                                               SOURCE-SEQUENCE)
                                                              (CDR SOURCE-SEQUENCE)))
                                                      ((OR (>= TARGET-INDEX TARGET-END)
                                                           (>= SOURCE-INDEX SOURCE-END)
                                                           (ENDP SOURCE-SEQUENCE))
                                                       TARGET-SEQUENCE)
                                                      (SETF (AREF TARGET-SEQUENCE TARGET-INDEX)
                                                            (CAR SOURCE-SEQUENCE)))))

(DEFUN CL:REPLACE (TARGET-SEQUENCE SOURCE-SEQUENCE &KEY ((:START1 TARGET-START)
                                                         0)
                         ((:END1 TARGET-END))
                         ((:START2 SOURCE-START)
                          0)
                         ((:END2 SOURCE-END))
                         &AUX
                         (TARGET-LENGTH (CL:LENGTH TARGET-SEQUENCE))
                         (SOURCE-LENGTH (CL:LENGTH SOURCE-SEQUENCE))) 
                                                             (* jrb: "23-Apr-86 11:00")
   (CL:UNLESS TARGET-END (SETQ TARGET-END TARGET-LENGTH))
   (CL:UNLESS SOURCE-END (SETQ SOURCE-END SOURCE-LENGTH))
   (CHECK-SUBSEQ TARGET-SEQUENCE TARGET-START TARGET-END TARGET-LENGTH)
   (CHECK-SUBSEQ SOURCE-SEQUENCE SOURCE-START SOURCE-END SOURCE-LENGTH)
   (SEQ-DISPATCH TARGET-SEQUENCE (SEQ-DISPATCH SOURCE-SEQUENCE (LIST-REPLACE-FROM-LIST)
                                        (LIST-REPLACE-FROM-MUMBLE))
          (SEQ-DISPATCH SOURCE-SEQUENCE (MUMBLE-REPLACE-FROM-LIST)
                 (MUMBLE-REPLACE-FROM-MUMBLE))))

(DEFUN LIST-REPLACE-FROM-LIST* (TARGET-SEQUENCE SOURCE-SEQUENCE TARGET-START TARGET-END SOURCE-START 
                                      SOURCE-END) (COND
                                                     ((NULL TARGET-END)
                                                      (SETQ TARGET-END (CL:LENGTH TARGET-SEQUENCE))))
                                                  (COND
                                                     ((NULL SOURCE-END)
                                                      (SETQ SOURCE-END (CL:LENGTH SOURCE-SEQUENCE))))
                                                  (LIST-REPLACE-FROM-LIST))

(DEFUN LIST-REPLACE-FROM-VECTOR* (TARGET-SEQUENCE SOURCE-SEQUENCE TARGET-START TARGET-END 
                                        SOURCE-START SOURCE-END) (COND
                                                                    ((NULL TARGET-END)
                                                                     (SETQ TARGET-END (CL:LENGTH
                                                                                       
                                                                                      TARGET-SEQUENCE
                                                                                       ))))
                                                                 (COND
                                                                    ((NULL SOURCE-END)
                                                                     (SETQ SOURCE-END (CL:LENGTH
                                                                                       
                                                                                      SOURCE-SEQUENCE
                                                                                       ))))
                                                                 (LIST-REPLACE-FROM-MUMBLE))

(DEFUN VECTOR-REPLACE-FROM-LIST* (TARGET-SEQUENCE SOURCE-SEQUENCE TARGET-START TARGET-END 
                                        SOURCE-START SOURCE-END) (COND
                                                                    ((NULL TARGET-END)
                                                                     (SETQ TARGET-END (CL:LENGTH
                                                                                       
                                                                                      TARGET-SEQUENCE
                                                                                       ))))
                                                                 (COND
                                                                    ((NULL SOURCE-END)
                                                                     (SETQ SOURCE-END (CL:LENGTH
                                                                                       
                                                                                      SOURCE-SEQUENCE
                                                                                       ))))
                                                                 (MUMBLE-REPLACE-FROM-LIST))

(DEFUN VECTOR-REPLACE-FROM-VECTOR* (TARGET-SEQUENCE SOURCE-SEQUENCE TARGET-START TARGET-END 
                                          SOURCE-START SOURCE-END) (COND
                                                                      ((NULL TARGET-END)
                                                                       (SETQ TARGET-END (CL:LENGTH
                                                                                         
                                                                                      TARGET-SEQUENCE
                                                                                         ))))
                                                                   (COND
                                                                      ((NULL SOURCE-END)
                                                                       (SETQ SOURCE-END (CL:LENGTH
                                                                                         
                                                                                      SOURCE-SEQUENCE
                                                                                         ))))
                                                                   (MUMBLE-REPLACE-FROM-MUMBLE))

(DEFMACRO MUMBLE-DELETE (PRED) (BQUOTE (CL:DO ((INDEX START (1+ INDEX))
                                               (JNDEX START)
                                               (NUMBER-ZAPPED 0))
                                              ((OR (= INDEX END)
                                                   (= NUMBER-ZAPPED COUNT))
                                               (CL:DO ((INDEX INDEX (1+ INDEX))
                                                       (JNDEX JNDEX (1+ JNDEX)))
                                                      ((= INDEX LENGTH)
                                                       (SHRINK-VECTOR SEQUENCE JNDEX))
                                                      (SETF (AREF SEQUENCE JNDEX)
                                                            (AREF SEQUENCE INDEX))))
                                              (SETF (AREF SEQUENCE JNDEX)
                                                    (AREF SEQUENCE INDEX))
                                              (CL:IF (\, PRED)
                                                     (INCF NUMBER-ZAPPED)
                                                     (INCF JNDEX)))))

(DEFMACRO MUMBLE-DELETE-FROM-END (PRED) (BQUOTE (CL:DO ((INDEX (1- END)
                                                               (1- INDEX))
                                                        (NUMBER-ZAPPED 0)
                                                        (LOSERS NIL)
                                                        (TERMINUS (1- START)))
                                                       ((OR (= INDEX TERMINUS)
                                                            (= NUMBER-ZAPPED COUNT))
                                                        (CL:DO ((LOSERS LOSERS)
                                                                (INDEX START (1+ INDEX))
                                                                (JNDEX START))
                                                               ((OR (NULL LOSERS)
                                                                    (= INDEX END))
                                                                (CL:DO ((INDEX INDEX (1+ INDEX))
                                                                        (JNDEX JNDEX (1+ JNDEX)))
                                                                       ((= INDEX LENGTH)
                                                                        (SHRINK-VECTOR SEQUENCE JNDEX
                                                                               ))
                                                                       (SETF (AREF SEQUENCE JNDEX)
                                                                             (AREF SEQUENCE INDEX))))
                                                               (SETF (AREF SEQUENCE JNDEX)
                                                                     (AREF SEQUENCE INDEX))
                                                               (CL:IF (= INDEX (CAR LOSERS))
                                                                      (CL:POP LOSERS)
                                                                      (INCF JNDEX))))
                                                       (LET ((THIS-ELEMENT (AREF SEQUENCE INDEX)))
                                                            (COND
                                                               ((\, PRED)
                                                                (INCF NUMBER-ZAPPED)
                                                                (CL:PUSH INDEX LOSERS)))))))

(DEFMACRO LIST-DELETE (PRED) (BQUOTE (LET ((HANDLE (CONS NIL SEQUENCE)))
                                          (CL:DO ((CURRENT (NTHCDR START SEQUENCE)
                                                         (CDR CURRENT))
                                                  (PREVIOUS (NTHCDR START HANDLE))
                                                  (INDEX START (1+ INDEX))
                                                  (NUMBER-ZAPPED 0))
                                                 ((OR (= INDEX END)
                                                      (= NUMBER-ZAPPED COUNT))
                                                  (CDR HANDLE))
                                                 (COND
                                                    ((\, PRED)
                                                     (RPLACD PREVIOUS (CDR CURRENT))
                                                     (INCF NUMBER-ZAPPED))
                                                    (T (CL:POP PREVIOUS)))))))

(DEFMACRO LIST-DELETE-FROM-END (PRED) (BQUOTE (LET* ((REVERSE (REVERSE SEQUENCE))
                                                     (HANDLE (CONS NIL REVERSE)))
                                                    (CL:DO ((CURRENT (NTHCDR (- LENGTH END)
                                                                            REVERSE)
                                                                   (CDR CURRENT))
                                                            (PREVIOUS (NTHCDR (- LENGTH END)
                                                                             HANDLE))
                                                            (INDEX START (1+ INDEX))
                                                            (NUMBER-ZAPPED 0))
                                                           ((OR (= INDEX END)
                                                                (= NUMBER-ZAPPED COUNT))
                                                            (REVERSE (CDR HANDLE)))
                                                           (COND
                                                              ((\, PRED)
                                                               (RPLACD PREVIOUS (CDR CURRENT))
                                                               (INCF NUMBER-ZAPPED))
                                                              (T (CL:POP PREVIOUS)))))))

(DEFMACRO NORMAL-MUMBLE-DELETE NIL (BQUOTE (MUMBLE-DELETE (CL:IF TEST-NOT
                                                                 (NOT (FUNCALL TEST-NOT ITEM
                                                                             (FUNCALL KEY
                                                                                    (AREF SEQUENCE 
                                                                                          INDEX))))
                                                                 (FUNCALL TEST ITEM
                                                                        (FUNCALL KEY (AREF SEQUENCE 
                                                                                           INDEX)))))
                                          ))

(DEFMACRO NORMAL-MUMBLE-DELETE-FROM-END NIL (BQUOTE (MUMBLE-DELETE-FROM-END
                                                     (CL:IF TEST-NOT (NOT (FUNCALL TEST-NOT ITEM
                                                                                 (FUNCALL KEY 
                                                                                        THIS-ELEMENT)
                                                                                 ))
                                                            (FUNCALL TEST ITEM (FUNCALL KEY 
                                                                                      THIS-ELEMENT)))
                                                     )))

(DEFMACRO NORMAL-LIST-DELETE NIL (QUOTE (LIST-DELETE (CL:IF TEST-NOT
                                                            (NOT (FUNCALL TEST-NOT ITEM
                                                                        (FUNCALL KEY (CAR CURRENT))))
                                                            (FUNCALL TEST ITEM (FUNCALL KEY
                                                                                      (CAR CURRENT)))
                                                            ))))

(DEFMACRO NORMAL-LIST-DELETE-FROM-END NIL (QUOTE (LIST-DELETE-FROM-END
                                                  (CL:IF TEST-NOT (NOT (FUNCALL TEST-NOT ITEM
                                                                              (FUNCALL KEY
                                                                                     (CAR CURRENT))))
                                                         (FUNCALL TEST ITEM (FUNCALL KEY (CAR CURRENT
                                                                                              )))))))

(DEFUN CL:DELETE (ITEM SEQUENCE &KEY FROM-END (TEST (FUNCTION EQL))
                       TEST-NOT
                       (START 0)
                       END
                       (COUNT MOST-POSITIVE-FIXNUM)
                       (KEY (FUNCTION IDENTITY))
                       &AUX
                       (LENGTH (CL:LENGTH SEQUENCE))) 
    "Returns a sequence formed by destructively removing the specified Item from the given sequence."
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (SEQ-DISPATCH SEQUENCE (CL:IF FROM-END (NORMAL-LIST-DELETE-FROM-END)
                                 (NORMAL-LIST-DELETE))
          (CL:IF FROM-END (NORMAL-MUMBLE-DELETE-FROM-END)
                 (NORMAL-MUMBLE-DELETE))))

(DEFMACRO IF-MUMBLE-DELETE NIL (BQUOTE (MUMBLE-DELETE (FUNCALL PREDICATE (FUNCALL KEY
                                                                                (AREF SEQUENCE INDEX)
                                                                                )))))

(DEFMACRO IF-MUMBLE-DELETE-FROM-END NIL (BQUOTE (MUMBLE-DELETE-FROM-END (FUNCALL PREDICATE
                                                                               (FUNCALL KEY 
                                                                                      THIS-ELEMENT)))
                                               ))

(DEFMACRO IF-LIST-DELETE NIL (QUOTE (LIST-DELETE (FUNCALL PREDICATE (FUNCALL KEY (CAR CURRENT))))))

(DEFMACRO IF-LIST-DELETE-FROM-END NIL (QUOTE (LIST-DELETE-FROM-END (FUNCALL PREDICATE
                                                                          (FUNCALL KEY (CAR CURRENT))
                                                                          ))))

(DEFUN DELETE-IF (PREDICATE SEQUENCE &KEY FROM-END (START 0)
                        (KEY (FUNCTION IDENTITY))
                        END
                        (COUNT MOST-POSITIVE-FIXNUM)
                        &AUX
                        (LENGTH (CL:LENGTH SEQUENCE))) "Returns a sequence formed by destructively removing the elements satisfying the specified predicate from the given sequence."
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (SEQ-DISPATCH SEQUENCE (CL:IF FROM-END (IF-LIST-DELETE-FROM-END)
                                 (IF-LIST-DELETE))
          (CL:IF FROM-END (IF-MUMBLE-DELETE-FROM-END)
                 (IF-MUMBLE-DELETE))))

(DEFMACRO IF-NOT-MUMBLE-DELETE NIL (BQUOTE (MUMBLE-DELETE (NOT (FUNCALL PREDICATE
                                                                      (FUNCALL KEY (AREF SEQUENCE 
                                                                                         INDEX)))))))

(DEFMACRO IF-NOT-MUMBLE-DELETE-FROM-END NIL (BQUOTE (MUMBLE-DELETE-FROM-END
                                                     (NOT (FUNCALL PREDICATE (FUNCALL KEY 
                                                                                    THIS-ELEMENT))))))

(DEFMACRO IF-NOT-LIST-DELETE NIL (QUOTE (LIST-DELETE (FUNCALL PREDICATE (FUNCALL KEY (CAR CURRENT))))
                                        ))

(DEFMACRO IF-NOT-LIST-DELETE-FROM-END NIL (QUOTE (LIST-DELETE-FROM-END (FUNCALL PREDICATE
                                                                              (FUNCALL KEY
                                                                                     (CAR CURRENT))))
                                                 ))

(DEFUN DELETE-IF-NOT (PREDICATE SEQUENCE &KEY FROM-END (START 0)
                            END
                            (KEY (FUNCTION IDENTITY))
                            (COUNT MOST-POSITIVE-FIXNUM)
                            &AUX
                            (LENGTH (CL:LENGTH SEQUENCE))) "Returns a sequence formed by destructively removing the elements not satisfying the specified Predicate from the given Sequence."
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (SEQ-DISPATCH SEQUENCE (CL:IF FROM-END (IF-NOT-LIST-DELETE-FROM-END)
                                 (IF-NOT-LIST-DELETE))
          (CL:IF FROM-END (IF-NOT-MUMBLE-DELETE-FROM-END)
                 (IF-NOT-MUMBLE-DELETE))))

(DEFMACRO MUMBLE-REMOVE-MACRO (BUMP LEFT BEGIN FINISH RIGHT PRED)
   (BQUOTE (CL:DO ((INDEX (\, BEGIN)
                          ((\, BUMP)
                           INDEX))
                   (RESULT (CL:DO ((INDEX (\, LEFT)
                                          ((\, BUMP)
                                           INDEX))
                                   (RESULT (MAKE-SEQUENCE-LIKE SEQUENCE LENGTH)))
                                  ((= INDEX (\, BEGIN))
                                   RESULT)
                                  (SETF (AREF RESULT INDEX)
                                        (AREF SEQUENCE INDEX))))
                   (NEW-INDEX (\, BEGIN))
                   (NUMBER-ZAPPED 0)
                   (THIS-ELEMENT))
                  ((OR (= INDEX (\, FINISH))
                       (= NUMBER-ZAPPED COUNT))
                   (CL:DO ((INDEX INDEX ((\, BUMP)
                                         INDEX))
                           (NEW-INDEX NEW-INDEX ((\, BUMP)
                                                 NEW-INDEX)))
                          ((= INDEX (\, RIGHT))
                           (SHRINK-VECTOR RESULT NEW-INDEX))
                          (SETF (AREF RESULT NEW-INDEX)
                                (AREF SEQUENCE INDEX))))
                  (LET ((THIS-ELEMENT (AREF SEQUENCE INDEX)))
                       (COND
                          ((\, PRED)
                           (SETF (AREF RESULT NEW-INDEX)
                                 THIS-ELEMENT)
                           (SETQ NEW-INDEX ((\, BUMP)
                                            NEW-INDEX)))
                          (T (INCF NUMBER-ZAPPED)))))))

(DEFMACRO MUMBLE-REMOVE (PRED) (BQUOTE (MUMBLE-REMOVE-MACRO 1+ 0 START END LENGTH (\, PRED))))

(DEFMACRO MUMBLE-REMOVE-FROM-END (PRED) (BQUOTE (LET ((SEQUENCE (COPY-SEQ SEQUENCE)))
                                                     (MUMBLE-DELETE-FROM-END (NOT (\, PRED))))))

(DEFMACRO LIST-REMOVE-MACRO (PRED REVERSE?)
   (BQUOTE (LET* ((\,@ (CL:WHEN REVERSE? (QUOTE ((SEQUENCE (REVERSE SEQUENCE))))))
                  (SPLICE (LIST NIL))
                  (RESULTS (CL:DO ((INDEX 0 (1+ INDEX))
                                   (BEFORE-START SPLICE))
                                  ((= INDEX START)
                                   BEFORE-START)
                                  (SETQ SPLICE (CDR (RPLACD SPLICE (CONS (CL:POP SEQUENCE)
                                                                         NIL)))))))
                 (CL:DO ((INDEX START (1+ INDEX))
                         (THIS-ELEMENT)
                         (NUMBER-ZAPPED 0))
                        ((OR (= INDEX END)
                             (= NUMBER-ZAPPED COUNT))
                         (CL:DO ((INDEX INDEX (1+ INDEX)))
                                ((NULL SEQUENCE)
                                 (\, (CL:IF REVERSE? (QUOTE (REVERSE (CDR RESULTS)))
                                            (QUOTE (CDR RESULTS)))))
                                (SETQ SPLICE (CDR (RPLACD SPLICE (CONS (CL:POP SEQUENCE)
                                                                       NIL))))))
                        (SETQ THIS-ELEMENT (CL:POP SEQUENCE))
                        (CL:IF (\, PRED)
                               (SETQ SPLICE (CDR (RPLACD SPLICE (CONS THIS-ELEMENT NIL))))
                               (INCF NUMBER-ZAPPED))))))

(DEFMACRO LIST-REMOVE (PRED) (BQUOTE (LIST-REMOVE-MACRO (\, PRED)
                                            NIL)))

(DEFMACRO LIST-REMOVE-FROM-END (PRED) (BQUOTE (LIST-REMOVE-MACRO (\, PRED)
                                                     T)))

(DEFMACRO NORMAL-MUMBLE-REMOVE NIL (BQUOTE (MUMBLE-REMOVE (CL:IF TEST-NOT (FUNCALL TEST-NOT ITEM
                                                                                 (FUNCALL KEY 
                                                                                        THIS-ELEMENT)
                                                                                 )
                                                                 (NOT (FUNCALL TEST ITEM
                                                                             (FUNCALL KEY 
                                                                                    THIS-ELEMENT)))))
                                          ))

(DEFMACRO NORMAL-MUMBLE-REMOVE-FROM-END NIL (BQUOTE (MUMBLE-REMOVE-FROM-END
                                                     (CL:IF TEST-NOT (FUNCALL TEST-NOT ITEM
                                                                            (FUNCALL KEY THIS-ELEMENT
                                                                                   ))
                                                            (NOT (FUNCALL TEST ITEM (FUNCALL KEY 
                                                                                         THIS-ELEMENT
                                                                                           )))))))

(DEFMACRO NORMAL-LIST-REMOVE NIL (BQUOTE (LIST-REMOVE (CL:IF TEST-NOT (FUNCALL TEST-NOT ITEM
                                                                             (FUNCALL KEY 
                                                                                    THIS-ELEMENT))
                                                             (NOT (FUNCALL TEST ITEM (FUNCALL KEY 
                                                                                         THIS-ELEMENT
                                                                                            )))))))

(DEFMACRO NORMAL-LIST-REMOVE-FROM-END NIL (BQUOTE (LIST-REMOVE-FROM-END
                                                   (CL:IF TEST-NOT (FUNCALL TEST-NOT ITEM
                                                                          (FUNCALL KEY THIS-ELEMENT))
                                                          (NOT (FUNCALL TEST ITEM (FUNCALL KEY 
                                                                                         THIS-ELEMENT
                                                                                         )))))))

(DEFUN CL:REMOVE (ITEM SEQUENCE &KEY FROM-END (TEST (FUNCTION EQL))
                       TEST-NOT
                       (START 0)
                       END
                       (COUNT MOST-POSITIVE-FIXNUM)
                       (KEY (FUNCTION IDENTITY))
                       &AUX
                       (LENGTH (CL:LENGTH SEQUENCE)))        (* raf " 3-Dec-85 23:31")
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (SEQ-DISPATCH SEQUENCE (CL:IF FROM-END (NORMAL-LIST-REMOVE-FROM-END)
                                 (NORMAL-LIST-REMOVE))
          (CL:IF FROM-END (NORMAL-MUMBLE-REMOVE-FROM-END)
                 (NORMAL-MUMBLE-REMOVE))))

(DEFMACRO IF-MUMBLE-REMOVE NIL (BQUOTE (MUMBLE-REMOVE (NOT (FUNCALL PREDICATE (FUNCALL KEY 
                                                                                     THIS-ELEMENT))))
                                      ))

(DEFMACRO IF-MUMBLE-REMOVE-FROM-END NIL (BQUOTE (MUMBLE-REMOVE-FROM-END (NOT (FUNCALL PREDICATE
                                                                                    (FUNCALL KEY 
                                                                                         THIS-ELEMENT
                                                                                           ))))))

(DEFMACRO IF-LIST-REMOVE NIL (BQUOTE (LIST-REMOVE (NOT (FUNCALL PREDICATE (FUNCALL KEY THIS-ELEMENT))
                                                       ))))

(DEFMACRO IF-LIST-REMOVE-FROM-END NIL (BQUOTE (LIST-REMOVE-FROM-END (NOT (FUNCALL PREDICATE
                                                                                (FUNCALL KEY 
                                                                                       THIS-ELEMENT))
                                                                         ))))

(DEFUN REMOVE-IF (PREDICATE SEQUENCE &KEY FROM-END (START 0)
                        END
                        (COUNT MOST-POSITIVE-FIXNUM)
                        (KEY (FUNCTION IDENTITY))
                        &AUX
                        (LENGTH (CL:LENGTH SEQUENCE))) 
      "Returns a copy of sequence with elements such that predicate(element) is non-null are removed"
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (SEQ-DISPATCH SEQUENCE (CL:IF FROM-END (IF-LIST-REMOVE-FROM-END)
                                 (IF-LIST-REMOVE))
          (CL:IF FROM-END (IF-MUMBLE-REMOVE-FROM-END)
                 (IF-MUMBLE-REMOVE))))

(DEFMACRO IF-NOT-MUMBLE-REMOVE NIL (BQUOTE (MUMBLE-REMOVE (FUNCALL PREDICATE (FUNCALL KEY 
                                                                                    THIS-ELEMENT)))))

(DEFMACRO IF-NOT-MUMBLE-REMOVE-FROM-END NIL (BQUOTE (MUMBLE-REMOVE-FROM-END (FUNCALL PREDICATE
                                                                                   (FUNCALL KEY 
                                                                                         THIS-ELEMENT
                                                                                          )))))

(DEFMACRO IF-NOT-LIST-REMOVE NIL (BQUOTE (LIST-REMOVE (FUNCALL PREDICATE (FUNCALL KEY THIS-ELEMENT)))
                                        ))

(DEFMACRO IF-NOT-LIST-REMOVE-FROM-END NIL (BQUOTE (LIST-REMOVE-FROM-END (FUNCALL PREDICATE
                                                                               (FUNCALL KEY 
                                                                                      THIS-ELEMENT)))
                                                 ))

(DEFUN REMOVE-IF-NOT (PREDICATE SEQUENCE &KEY FROM-END (START 0)
                            END
                            (COUNT MOST-POSITIVE-FIXNUM)
                            (KEY (FUNCTION IDENTITY))
                            &AUX
                            (LENGTH (CL:LENGTH SEQUENCE))) 
          "Returns a copy of sequence with elements such that predicate(element) is null are removed"
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (SEQ-DISPATCH SEQUENCE (CL:IF FROM-END (IF-NOT-LIST-REMOVE-FROM-END)
                                 (IF-NOT-LIST-REMOVE))
          (CL:IF FROM-END (IF-NOT-MUMBLE-REMOVE-FROM-END)
                 (IF-NOT-MUMBLE-REMOVE))))

(DEFUN LIST-REMOVE-DUPLICATES* (LIST TEST TEST-NOT START END KEY FROM-END)
   (LET* ((RESULT (LIST NIL))
          (SPLICE RESULT)
          (CURRENT LIST))
         (CL:DO ((INDEX 0 (1+ INDEX)))
                ((= INDEX START))
                (SETQ SPLICE (CDR (RPLACD SPLICE (LIST (CAR CURRENT)))))
                (CL:POP CURRENT))                            (* "RESULT now holds the head of the list up to, but not including start. SPLICE points to the next cell to be RPLACD'ed. CURRENT is the tail to be processed.")
         (CL:DO ((SUBLIST (CDR SPLICE))
                 (INDEX START (1+ INDEX)))
                ((OR (AND END (>= INDEX END))
                     (ENDP CURRENT)))
                (CL:UNLESS (CL:IF FROM-END (CL:MEMBER (FUNCALL KEY (CAR CURRENT))
                                                  (NTHCDR START (CDR RESULT))
                                                  :TEST TEST :TEST-NOT TEST-NOT :KEY KEY)
                                  (CL:DO ((IT (FUNCALL KEY (CAR CURRENT)))
                                          (L (CDR CURRENT)
                                             (CDR L))
                                          (I (1+ INDEX)
                                             (1+ I)))
                                         ((OR (ENDP L)
                                              (>= I END))
                                          NIL)
                                         (CL:WHEN (CL:IF TEST-NOT (NOT (FUNCALL TEST-NOT IT
                                                                              (FUNCALL KEY
                                                                                     (CAR L))))
                                                         (FUNCALL TEST IT (FUNCALL KEY (CAR L))))
                                                (RETURN T))))
                       (SETQ SPLICE (CDR (RPLACD SPLICE (LIST (CAR CURRENT))))))
                (CL:POP CURRENT))
         (RPLACD SPLICE CURRENT)
         (CDR RESULT)))

(DEFUN VECTOR-REMOVE-DUPLICATES* (VECTOR TEST TEST-NOT START END KEY FROM-END &OPTIONAL
                                        (LENGTH (CL:LENGTH VECTOR)))
   (DECLARE (TYPE VECTOR VECTOR))                            (* raf "17-Dec-85 22:38")
   (LET ((RESULT (MAKE-SEQUENCE-LIKE VECTOR LENGTH))
         (INDEX 0)
         (JNDEX START))
        (CL:DO NIL ((= INDEX START))
               (SETF (AREF RESULT INDEX)
                     (AREF VECTOR INDEX))
               (INCF INDEX))
        (CL:DO NIL ((= INDEX END))
               (LET ((ELT (AREF VECTOR INDEX)))
                    (COND
                       ((NOT (CL:IF FROM-END
                                    (CL:POSITION (FUNCALL KEY ELT)
                                           RESULT :START START :END JNDEX :TEST TEST :TEST-NOT 
                                           TEST-NOT :KEY KEY)
                                    (CL:POSITION (FUNCALL KEY ELT)
                                           VECTOR :START (1+ INDEX)
                                           :END END :TEST TEST :TEST-NOT TEST-NOT :KEY KEY)))
                        (SETF (AREF RESULT JNDEX)
                              ELT)
                        (INCF JNDEX))))
               (INCF INDEX))
        (CL:DO NIL ((= INDEX LENGTH))
               (SETF (AREF RESULT JNDEX)
                     (AREF VECTOR INDEX))
               (INCF INDEX)
               (INCF JNDEX))
        (SHRINK-VECTOR RESULT JNDEX)))

(DEFUN REMOVE-DUPLICATES (SEQUENCE &KEY (TEST (FUNCTION EQL))
                                TEST-NOT
                                (START 0)
                                FROM-END END (KEY (FUNCTION IDENTITY))
                                &AUX
                                (LENGTH (CL:LENGTH SEQUENCE))) "The elements of Sequence are examined, and if any two match, one is discarded.  The resulting sequence is returned."
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (SEQ-DISPATCH SEQUENCE (CL:WHEN SEQUENCE (LIST-REMOVE-DUPLICATES* SEQUENCE TEST TEST-NOT START END 
                                                   KEY FROM-END))
          (VECTOR-REMOVE-DUPLICATES* SEQUENCE TEST TEST-NOT START END KEY FROM-END)))

(DEFUN LIST-DELETE-DUPLICATES* (LIST TEST TEST-NOT KEY FROM-END START END)
   (LET ((HANDLE (CONS NIL LIST)))
        (CL:DO ((CURRENT (NTHCDR START LIST)
                       (CDR CURRENT))
                (PREVIOUS (NTHCDR START HANDLE))
                (INDEX START (1+ INDEX)))
               ((OR (= INDEX END)
                    (NULL CURRENT))
                (CDR HANDLE))
               (CL:IF (CL:DO ((X (CL:IF FROM-END (NTHCDR (1+ START)
                                                        HANDLE)
                                        (CDR CURRENT))
                                 (CDR X))
                              (I (1+ INDEX)
                                 (1+ I)))
                             ((OR (NULL X)
                                  (AND (NOT FROM-END)
                                       (= I END))
                                  (EQ X CURRENT))
                              NIL)
                             (CL:WHEN (CL:IF TEST-NOT (NOT (FUNCALL TEST-NOT (FUNCALL KEY
                                                                                    (CAR CURRENT))
                                                                  (FUNCALL KEY (CAR X))))
                                             (FUNCALL TEST (FUNCALL KEY (CAR CURRENT))
                                                    (FUNCALL KEY (CAR X))))
                                    (RETURN T)))
                      (RPLACD PREVIOUS (CDR CURRENT))
                      (CL:POP PREVIOUS)))))

(DEFUN VECTOR-DELETE-DUPLICATES* (VECTOR TEST TEST-NOT KEY FROM-END START END &OPTIONAL
                                        (LENGTH (CL:LENGTH VECTOR)))
   (DECLARE (TYPE VECTOR VECTOR))                            (* raf "17-Dec-85 22:39")
   (CL:DO ((INDEX START (1+ INDEX))
           (JNDEX START))
          ((= INDEX END)
           (CL:DO ((INDEX INDEX (1+ INDEX))
                   (JNDEX JNDEX (1+ JNDEX)))
                  ((= INDEX LENGTH)
                   (SHRINK-VECTOR VECTOR JNDEX)
                   VECTOR)
                  (SETF (AREF VECTOR JNDEX)
                        (AREF VECTOR INDEX))))
          (SETF (AREF VECTOR JNDEX)
                (AREF VECTOR INDEX))
          (CL:UNLESS (CL:POSITION (FUNCALL KEY (AREF VECTOR INDEX))
                            VECTOR :KEY KEY :TEST TEST :TEST-NOT TEST-NOT :START (CL:IF FROM-END 
                                                                                        START
                                                                                        (1+ INDEX))
                            :END
                            (CL:IF FROM-END JNDEX END))
                 (INCF JNDEX))))

(DEFUN DELETE-DUPLICATES (SEQUENCE &KEY (TEST (FUNCTION EQL))
                                TEST-NOT
                                (START 0)
                                FROM-END END (KEY (FUNCTION IDENTITY))
                                &AUX
                                (LENGTH (CL:LENGTH SEQUENCE))) "The elements of Sequence are examined, and if any two match, one is discarded. The resulting sequence, which may be formed by destroying the given sequence, is returned."
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (SEQ-DISPATCH SEQUENCE (COND
                             (SEQUENCE (LIST-DELETE-DUPLICATES* SEQUENCE TEST TEST-NOT KEY FROM-END 
                                              START END))
                             (T NIL))
          (VECTOR-DELETE-DUPLICATES* SEQUENCE TEST TEST-NOT KEY FROM-END START END)))

(DEFMACRO SUBST-DISPATCH (PRED) (BQUOTE (SEQ-DISPATCH SEQUENCE
                                               (CL:IF FROM-END (REVERSE (LIST-SUBSTITUTE*
                                                                         (\, PRED)
                                                                         NEW
                                                                         (REVERSE SEQUENCE)
                                                                         (- LENGTH END)
                                                                         (- LENGTH START)
                                                                         COUNT KEY TEST TEST-NOT OLD)
                                                                      )
                                                      (LIST-SUBSTITUTE* (\, PRED)
                                                             NEW SEQUENCE START END COUNT KEY TEST 
                                                             TEST-NOT OLD))
                                               (CL:IF FROM-END (VECTOR-SUBSTITUTE* (\, PRED)
                                                                      NEW SEQUENCE -1 (1- LENGTH)
                                                                      -1 LENGTH (1- END)
                                                                      (1- START)
                                                                      COUNT KEY TEST TEST-NOT OLD)
                                                      (VECTOR-SUBSTITUTE* (\, PRED)
                                                             NEW SEQUENCE 1 0 LENGTH LENGTH START END 
                                                             COUNT KEY TEST TEST-NOT OLD)))))

(DEFUN LIST-SUBSTITUTE* (PRED NEW LIST START END COUNT KEY TEST TEST-NOT OLD) 
                                                             (* kbr: "31-Aug-85 20:01")
   (LET* ((RESULT (LIST NIL))
          (SPLICE RESULT)
          (LIST LIST))                                       (* " Get a local list for a stepper." 
                                                             *)
         (CL:DO ((INDEX 0 (1+ INDEX)))
                ((= INDEX START))
                (SETQ SPLICE (CDR (RPLACD SPLICE (LIST (CAR LIST)))))
                (CL:POP LIST))                               (* 
              "SPLICE points to the place to append to, LIST is now the appropriate tail to work on.")
         (CL:DO ((INDEX START (1+ INDEX)))
                ((OR (AND END (= INDEX END))
                     (ENDP LIST)
                     (= COUNT 0)))
                (LET ((ELT (CL:POP LIST)))
                     (SETQ SPLICE
                      (CDR (RPLACD SPLICE
                                  (LIST (COND
                                           ((ECASE PRED (NORMAL (CL:IF TEST-NOT
                                                                       (NOT (FUNCALL TEST-NOT OLD
                                                                                   (FUNCALL KEY ELT))
                                                                            )
                                                                       (FUNCALL TEST OLD
                                                                              (FUNCALL KEY ELT))))
                                                   (IF (FUNCALL TEST (FUNCALL KEY ELT)))
                                                   (IF-NOT (NOT (FUNCALL TEST (FUNCALL KEY ELT)))))
                                            (DECF COUNT)
                                            NEW)
                                           (T ELT))))))))
         (RPLACD SPLICE LIST)
         (CDR RESULT)))

(DEFUN VECTOR-SUBSTITUTE* (PRED NEW SEQUENCE INCREMENTER LEFT RIGHT LENGTH START END COUNT KEY TEST 
                                TEST-NOT OLD)                (* kbr: "31-Aug-85 20:01")
   (LET ((RESULT (MAKE-SEQUENCE-LIKE SEQUENCE LENGTH))
         (INDEX LEFT))
        (CL:DO NIL ((= INDEX START))
               (SETF (AREF RESULT INDEX)
                     (AREF SEQUENCE INDEX))
               (INCF INDEX INCREMENTER))
        (CL:DO ((ELT))
               ((OR (= INDEX END)
                    (= COUNT 0)))
               (SETQ ELT (AREF SEQUENCE INDEX))
               (SETF (AREF RESULT INDEX)
                     (COND
                        ((CASE PRED (NORMAL (CL:IF TEST-NOT (NOT (FUNCALL TEST-NOT OLD
                                                                        (FUNCALL KEY ELT)))
                                                   (FUNCALL TEST OLD (FUNCALL KEY ELT))))
                               (IF (FUNCALL TEST (FUNCALL KEY ELT)))
                               (IF-NOT (NOT (FUNCALL TEST (FUNCALL KEY ELT)))))
                         (DECF COUNT)
                         NEW)
                        (T ELT)))
               (INCF INDEX INCREMENTER))
        (CL:DO NIL ((= INDEX RIGHT))
               (SETF (AREF RESULT INDEX)
                     (AREF SEQUENCE INDEX))
               (INCF INDEX INCREMENTER))
        RESULT))

(DEFUN SUBSTITUTE (NEW OLD SEQUENCE &KEY FROM-END (TEST (FUNCTION EQL))
                       TEST-NOT
                       (START 0)
                       (COUNT MOST-POSITIVE-FIXNUM)
                       END
                       (KEY (FUNCTION IDENTITY))
                       &AUX
                       (LENGTH (CL:LENGTH SEQUENCE))) "Returns a sequence of the same kind as Sequence with the same elements except that all elements that match Old are replaced with New."
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (SUBST-DISPATCH (QUOTE NORMAL)))

(DEFUN SUBSTITUTE-IF (NEW TEST SEQUENCE &KEY FROM-END (START 0)
                          END
                          (COUNT MOST-POSITIVE-FIXNUM)
                          (KEY (FUNCTION IDENTITY))
                          &AUX
                          (LENGTH (CL:LENGTH SEQUENCE))) "Returns a sequence of the same kind as Sequence with the same elements except that all elements satisfying the Test are replaced with New."
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (LET (TEST-NOT OLD)
        (SUBST-DISPATCH (QUOTE IF))))

(DEFUN SUBSTITUTE-IF-NOT (NEW TEST SEQUENCE &KEY FROM-END (START 0)
                              END
                              (COUNT MOST-POSITIVE-FIXNUM)
                              (KEY (FUNCTION IDENTITY))
                              &AUX
                              (LENGTH (CL:LENGTH SEQUENCE))) "Returns a sequence of the same kind as Sequence with the same elements except that all elements not satisfying the Test are replaced with New."
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (LET (TEST-NOT OLD)
        (SUBST-DISPATCH (QUOTE IF-NOT))))

(DEFUN NLIST-SUBSTITUTE* (NEW OLD SEQUENCE TEST TEST-NOT START END COUNT KEY)
   (CL:DO ((LIST (NTHCDR START SEQUENCE)
                 (CDR LIST))
           (INDEX START (1+ INDEX)))
          ((OR (AND END (= INDEX END))
               (ENDP LIST)
               (= COUNT 0))
           SEQUENCE)
          (COND
             ((CL:IF TEST-NOT (NOT (FUNCALL TEST-NOT OLD (FUNCALL KEY (CAR LIST))))
                     (FUNCALL TEST OLD (FUNCALL KEY (CAR LIST))))
              (RPLACA LIST NEW)
              (DECF COUNT)))))

(DEFUN NVECTOR-SUBSTITUTE* (NEW OLD SEQUENCE INCREMENTER TEST TEST-NOT START END COUNT KEY)
   (CL:DO ((INDEX START (+ INDEX INCREMENTER)))
          ((OR (= INDEX END)
               (= COUNT 0))
           SEQUENCE)
          (COND
             ((CL:IF TEST-NOT (NOT (FUNCALL TEST-NOT OLD (FUNCALL KEY (AREF SEQUENCE INDEX))))
                     (FUNCALL TEST OLD (FUNCALL KEY (AREF SEQUENCE INDEX))))
              (SETF (AREF SEQUENCE INDEX)
                    NEW)
              (DECF COUNT)))))

(DEFUN NSUBSTITUTE (NEW OLD SEQUENCE &KEY FROM-END (TEST (FUNCTION EQL))
                        TEST-NOT END (COUNT MOST-POSITIVE-FIXNUM)
                        (KEY (FUNCTION IDENTITY))
                        (START 0)
                        &KEY
                        (LENGTH (CL:LENGTH SEQUENCE)))       (* raf "27-Jan-86 17:31")
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (LET ((INCREMENTER 1))
        (CL:WHEN FROM-END (PSETQ START (1- END)
                                 END
                                 (1- START)
                                 INCREMENTER -1))
        (SEQ-DISPATCH SEQUENCE (CL:IF FROM-END (DREVERSE (NLIST-SUBSTITUTE* NEW OLD (DREVERSE 
                                                                                           SEQUENCE)
                                                                TEST TEST-NOT START END COUNT KEY))
                                      (NLIST-SUBSTITUTE* NEW OLD SEQUENCE TEST TEST-NOT START END 
                                             COUNT KEY))
               (NVECTOR-SUBSTITUTE* NEW OLD SEQUENCE INCREMENTER TEST TEST-NOT START END COUNT KEY))))

(DEFUN NLIST-SUBSTITUTE-IF* (NEW TEST SEQUENCE START END COUNT KEY)
   (CL:DO ((LIST (NTHCDR START SEQUENCE)
                 (CDR LIST))
           (INDEX START (1+ INDEX)))
          ((OR (AND END (= INDEX END))
               (ENDP LIST)
               (= COUNT 0))
           SEQUENCE)
          (COND
             ((FUNCALL TEST (FUNCALL KEY (CAR LIST)))
              (RPLACA LIST NEW)
              (DECF COUNT)))))

(DEFUN NVECTOR-SUBSTITUTE-IF* (NEW TEST SEQUENCE INCREMENTER START END COUNT KEY)
   (CL:DO ((INDEX START (+ INDEX INCREMENTER)))
          ((OR (= INDEX END)
               (= COUNT 0))
           SEQUENCE)
          (COND
             ((FUNCALL TEST (FUNCALL KEY (AREF SEQUENCE INDEX)))
              (SETF (AREF SEQUENCE INDEX)
                    NEW)
              (DECF COUNT)))))

(DEFUN NSUBSTITUTE-IF (NEW TEST SEQUENCE &KEY FROM-END (START 0)
                           END
                           (COUNT MOST-POSITIVE-FIXNUM)
                           (KEY (FUNCTION IDENTITY))
                           &AUX
                           (LENGTH (CL:LENGTH SEQUENCE)))    (* raf "27-Jan-86 17:31")
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (LET ((INCREMENTER 1))
        (CL:WHEN FROM-END (PSETQ START (1- END)
                                 END
                                 (1- START)
                                 INCREMENTER -1))
        (SEQ-DISPATCH SEQUENCE (CL:IF FROM-END (DREVERSE (NLIST-SUBSTITUTE-IF* NEW TEST (DREVERSE
                                                                                         SEQUENCE)
                                                                START END COUNT KEY))
                                      (NLIST-SUBSTITUTE-IF* NEW TEST SEQUENCE START END COUNT KEY))
               (NVECTOR-SUBSTITUTE-IF* NEW TEST SEQUENCE INCREMENTER START END COUNT KEY))))

(DEFUN NLIST-SUBSTITUTE-IF-NOT* (NEW TEST SEQUENCE START END COUNT KEY)
   (CL:DO ((LIST (NTHCDR START SEQUENCE)
                 (CDR LIST))
           (INDEX START (1+ INDEX)))
          ((OR (AND END (= INDEX END))
               (ENDP LIST)
               (= COUNT 0))
           SEQUENCE)
          (COND
             ((NOT (FUNCALL TEST (FUNCALL KEY (CAR LIST))))
              (RPLACA LIST NEW)
              (DECF COUNT)))))

(DEFUN NVECTOR-SUBSTITUTE-IF-NOT* (NEW TEST SEQUENCE INCREMENTER START END COUNT KEY)
   (CL:DO ((INDEX START (+ INDEX INCREMENTER)))
          ((OR (= INDEX END)
               (= COUNT 0))
           SEQUENCE)
          (COND
             ((NOT (FUNCALL TEST (FUNCALL KEY (AREF SEQUENCE INDEX))))
              (SETF (AREF SEQUENCE INDEX)
                    NEW)
              (DECF COUNT)))))

(DEFUN NSUBSTITUTE-IF-NOT (NEW TEST SEQUENCE &KEY FROM-END (START 0)
                               END
                               (COUNT MOST-POSITIVE-FIXNUM)
                               (KEY (FUNCTION IDENTITY))
                               &AUX
                               (LENGTH (CL:LENGTH SEQUENCE))) 
                                                             (* raf "27-Jan-86 17:31")
   (CL:UNLESS END (SETQ END LENGTH))
   (CHECK-SUBSEQ SEQUENCE START END LENGTH)
   (LET ((INCREMENTER 1))
        (CL:WHEN FROM-END (PSETQ START (1- END)
                                 END
                                 (1- START)
                                 INCREMENTER -1))
        (SEQ-DISPATCH SEQUENCE (CL:IF FROM-END (DREVERSE (NLIST-SUBSTITUTE-IF-NOT* NEW TEST
                                                                (DREVERSE SEQUENCE)
                                                                START END COUNT KEY))
                                      (NLIST-SUBSTITUTE-IF-NOT* NEW TEST SEQUENCE START END COUNT KEY
                                             ))
               (NVECTOR-SUBSTITUTE-IF-NOT* NEW TEST SEQUENCE INCREMENTER START END COUNT KEY))))


(PUTPROPS CMLSEQMODIFY FILETYPE COMPILE-FILE)
(PUTPROPS CMLSEQMODIFY COPYRIGHT ("Xerox Corporation" 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL)))
STOP