(FILECREATED " 4-Jun-86 23:22:16" {ERIS}<LISPCORE>LIBRARY>CMLSORT.;10 28370  

      changes to:  (VARS CMLSORTCOMS)
                   (FNS CL:SORT %%SORT-SIMPLE-VECTOR %%SORT-VECTOR %%SORT-LIST STABLE-SORT 
                        %%STABLE-SORT-SIMPLE-VECTOR %%STABLE-SORT-VECTOR CL:MERGE %%MERGE-LISTS* 
                        %%MERGE-VECTORS* %%MERGE-SIMPLE-VECTORS %%MERGE-NON-SIMPLE-VECTORS 
                        %%STABLE-%%SORT-SIMPLE-VECTOR %%STABLE-%%SORT-VECTOR MERGE-VECTORS* 
                        MERGE-NON-SIMPLE-VECTORS MERGE-LISTS* MERGE-SIMPLE-VECTORS)

      previous date: " 4-Jun-86 23:17:12" {ERIS}<LISPCORE>LIBRARY>CMLSORT.;8)


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

(PRETTYCOMPRINT CMLSORTCOMS)

(RPAQQ CMLSORTCOMS 
       ((* * Section 14.5 Merging and Sorting -- By Kelly Roach. *)
        (DECLARE: DONTCOPY DOEVAL@COMPILE (MACROS APPLY-KEY APPLY-PRED SORT-PREFIX))
        (FNS CL:SORT %%SORT-SIMPLE-VECTOR %%SORT-VECTOR %%SORT-LIST)
        (FNS STABLE-SORT %%STABLE-SORT-SIMPLE-VECTOR %%STABLE-SORT-VECTOR)
        (FNS CL:MERGE %%MERGE-LISTS* %%MERGE-VECTORS* %%MERGE-SIMPLE-VECTORS 
             %%MERGE-NON-SIMPLE-VECTORS)
        (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
               (ADDVARS (NLAMA)
                      (NLAML)
                      (LAMA %%MERGE-NON-SIMPLE-VECTORS %%MERGE-SIMPLE-VECTORS %%MERGE-VECTORS* 
                            %%MERGE-LISTS* CL:MERGE %%STABLE-SORT-VECTOR %%STABLE-SORT-SIMPLE-VECTOR 
                            STABLE-SORT %%SORT-LIST %%SORT-VECTOR %%SORT-SIMPLE-VECTOR CL:SORT)))))
(* * Section 14.5 Merging and Sorting -- By Kelly Roach. *)

(DECLARE: DONTCOPY DOEVAL@COMPILE 
(DECLARE: EVAL@COMPILE 
(DEFMACRO APPLY-KEY (KEY CL:ELT)                             (* Apply-key applies the key to elt, 
                                                             or if key is NIL %%, then returns elt.
                                                             *) (BQUOTE (CL:IF (\, KEY)
                                                                               (FUNCALL (\, KEY)
                                                                                      (\, CL:ELT))
                                                                               (\, CL:ELT))))

(DEFMACRO APPLY-PRED (ONE TWO PRED KEY) 
          
          (* apply-pred applies the predicate and the key functions to two arguments.
          if the key function is NIL then apply-pred calls only the predicate function.
          *)
                                                             (* Internal Macro *)
 (BQUOTE (CL:IF (\, KEY)
                (FUNCALL (\, PRED)
                       (FUNCALL (\, KEY)
                              (\, ONE))
                       (FUNCALL (\, KEY)
                              (\, TWO)))
                (FUNCALL (\, PRED)
                       (\, ONE)
                       (\, TWO)))))

(DEFMACRO SORT-PREFIX NIL                                    (* The slightly more complicated 
                                                             version which follows eliminates the 
                                                             function call overhead, and eliminates 
                                                             the need to make LIST a special 
                                                             variable *)
                          (QUOTE (PROG ((STACK NIL)
                                        (RES NIL))
                                       CALL
                                       (CL:WHEN (NULL LIST)
                                              (SETQ RES NIL)
                                              (GO RETURN))
                                       (CL:WHEN (< HEIGHT 1)
                                              (SETQ RES (RPLACD (PROG1 LIST (SETQ LIST (CDR LIST)))
                                                               NIL))
                                              (GO RETURN))
                                       (CL:PUSH HEIGHT STACK)
                                       (SETQ HEIGHT (1- HEIGHT))
                                       (CL:PUSH (QUOTE S1)
                                              STACK)
                                       (GO CALL)
                                       S1
                                       (SETQ HEIGHT (1- (CAR STACK)))
                                       (CL:PUSH RES STACK)
                                       (CL:PUSH (QUOTE S2)
                                              STACK)
                                       (GO CALL)
                                       S2
                                       (SETQ RES (%%MERGE-LISTS* (POP STACK)
                                                        RES PRED KEY))
                                       (SETQ HEIGHT (POP STACK))
                                       (GO RETURN)
                                       RETURN
                                       (LET ((FLAG (POP STACK)))
                                            (CASE FLAG (S1 (GO S1))
                                                  (S2 (GO S2))
                                                  (T (RETURN RES)))))))

)
)
(DEFINEQ

(CL:SORT
  (CL:LAMBDA (SEQUENCE PREDICATE &KEY KEY)                   (* kbr: " 4-Jun-86 22:23")
                                                             (* Destructively sorts sequence.
                                                             Predicate should returns non-NIL if 
                                                             Arg1 is to precede Arg2.
                                                             *)
                                                             (* Sort dispatches to type specific 
                                                             sorting routines. *)
         (CL:IF (ARRAYP SEQUENCE)
                (CL:IF (> (CL:LENGTH SEQUENCE)
                          0)
                       (%%SORT-VECTOR SEQUENCE PREDICATE KEY)
                       SEQUENCE)
                (CL:IF (VECTORP SEQUENCE)
                       (CL:IF (> (CL:LENGTH (THE SIMPLE-VECTOR SEQUENCE))
                                 0)
                              (%%SORT-SIMPLE-VECTOR SEQUENCE PREDICATE KEY)
                              SEQUENCE)
                       (CL:IF (LISTP SEQUENCE)
                              (%%SORT-LIST SEQUENCE PREDICATE KEY)
                              (CL:ERROR "~S is not a sequence." SEQUENCE))))))

(%%SORT-SIMPLE-VECTOR
  (CL:LAMBDA (VECTOR PRED KEY)                               (* kbr: " 4-Jun-86 17:21")
          
          (* %%SORT-SIMPLE-VECTOR sorts vector using the Quicksort algorithm.
          Subranges (from bottom through top inclusive) of vector are partitioned by 
          selecting the first element of the subrange as a pivot, and then rearranging 
          the elements of the subrange so that those less than the pivot come before it, 
          and the others come after. First, the whole vector is partitioned, then each of 
          the two partitions is partitioned. When a parition is trivial
          (0 or 1 elt) we don't bother to do it. Pending partitions are remembered on a 
          stack. When the stack becomes empty, then the array has been sorted.
          *)

         (PROG (STACK PIVOT PIVKEY TOP BOTTOM TT BB)
          
          (* STACK = stack of pending top/bottom pairs * PIVOT = initial pair for whole 
          vector. * PIVKEY = The pivot element for a partition pass.
          The extracted key for pivot. * TOP BOTTOM = The range being partitioned
          (inclusive) * TT BB = Working indices. *)

               (SETQ STACK (LIST (1- (CL:LENGTH VECTOR))
                                 0))
           START-PARTITION
               (SETQ TT (SETQ TOP (POP STACK)))
               (SETQ BB (SETQ BOTTOM (POP STACK)))
               (SETQ PIVKEY (APPLY-KEY KEY (SETQ PIVOT (AREF VECTOR BOTTOM))))
           DOWN
               (CL:WHEN (= BB TT)
                      (GO END-PARTITION))
               (LET ((TOP-ELT (AREF VECTOR TT)))
                    (COND
                       ((FUNCALL PRED (APPLY-KEY KEY TOP-ELT)
                               PIVKEY)
                        (SETF (AREF VECTOR BB)
                              TOP-ELT)
                        (SETQ BB (1+ BB))
                        (GO UP))
                       (T (SETQ TT (1- TT))
                          (GO DOWN))))
           UP  (CL:WHEN (= BB TT)
                      (GO END-PARTITION))
               (LET ((BOT-ELT (AREF VECTOR BB)))
                    (COND
                       ((FUNCALL PRED PIVKEY (APPLY-KEY KEY BOT-ELT))
                        (SETF (AREF VECTOR TT)
                              BOT-ELT)
                        (SETQ TT (1- TT))
                        (GO DOWN))
                       (T (SETQ BB (1+ BB))
                          (GO UP))))
           END-PARTITION
               (SETF (AREF VECTOR BB)
                     PIVOT)
               (CL:WHEN (< BOTTOM (1- BB))
                      (CL:PUSH BOTTOM STACK)
                      (CL:PUSH (1- BB)
                             STACK))
               (CL:WHEN (> TOP (1+ TT))
                      (CL:PUSH (1+ TT)
                             STACK)
                      (CL:PUSH TOP STACK))
               (CL:WHEN (NULL STACK)
                      (RETURN VECTOR))
               (GO START-PARTITION))))

(%%SORT-VECTOR
  (CL:LAMBDA (VECTOR PRED KEY)                               (* kbr: " 4-Jun-86 17:24")
                                                             (* %%SORT-VECTOR is the same as 
                                                             sort-simple-vector except that vector 
                                                             is a "complex" array instead of a 
                                                             "simple" array. *)
         (PROG (STACK PIVOT PIVKEY TOP BOTTOM TT BB)
          
          (* STACK = stack of pending top/bottom pairs * PIVOT = initial pair for whole 
          vector. * PIVKEY = The pivot element for a partition pass.
          The extracted key for pivot. * TOP BOTTOM = The range being partitioned
          (inclusive) * TT BB = Working indices. *)

               (SETQ STACK (LIST (1- (CL:LENGTH VECTOR))
                                 0))
           START-PARTITION
               (SETQ TT (SETQ TOP (POP STACK)))
               (SETQ BB (SETQ BOTTOM (POP STACK)))
               (SETQ PIVKEY (APPLY-KEY KEY (SETQ PIVOT (AREF VECTOR BOTTOM))))
           DOWN
               (CL:WHEN (= BB TT)
                      (GO END-PARTITION))
               (LET ((TOP-ELT (AREF VECTOR TT)))
                    (COND
                       ((FUNCALL PRED (APPLY-KEY KEY TOP-ELT)
                               PIVKEY)
                        (SETF (AREF VECTOR BB)
                              TOP-ELT)
                        (SETQ BB (1+ BB))
                        (GO UP))
                       (T (SETQ TT (1- TT))
                          (GO DOWN))))
           UP  (CL:WHEN (= BB TT)
                      (GO END-PARTITION))
               (LET ((BOT-ELT (AREF VECTOR BB)))
                    (COND
                       ((FUNCALL PRED PIVKEY (APPLY-KEY KEY BOT-ELT))
                        (SETF (AREF VECTOR TT)
                              BOT-ELT)
                        (SETQ TT (1- TT))
                        (GO DOWN))
                       (T (SETQ BB (1+ BB))
                          (GO UP))))
           END-PARTITION
               (SETF (AREF VECTOR BB)
                     PIVOT)
               (CL:WHEN (< BOTTOM (1- BB))
                      (CL:PUSH BOTTOM STACK)
                      (CL:PUSH (1- BB)
                             STACK))
               (CL:WHEN (> TOP (1+ TT))
                      (CL:PUSH (1+ TT)
                             STACK)
                      (CL:PUSH TOP STACK))
               (CL:WHEN (NULL STACK)
                      (RETURN VECTOR))
               (GO START-PARTITION))))

(%%SORT-LIST
  (CL:LAMBDA (LIST PRED KEY)
          
          (* Sort-List returns a list containing the elements of LIST in sort.
          The original list is destroyed. Based on an algorithm described as:
          (BQUOTE a) "traditional" list merge sort' by Guy Steele in AI memo 587
          (aug (QUOTE 80)) %%. This sort is stable.
          *)

         (CL:DO ((HEIGHT 0 (1+ HEIGHT))
                 (RESULT NIL (%%MERGE-LISTS* RESULT (SORT-PREFIX)
                                    PRED KEY)))
                ((NULL LIST)
                 RESULT))))
)
(DEFINEQ

(STABLE-SORT
  (CL:LAMBDA (SEQUENCE PREDICATE &KEY KEY)                   (* kbr: " 4-Jun-86 22:34")
          
          (* Stable sort is the same as sort, but it guarantees that equal elements will 
          not change places. For lists, use the normal sort-list function, but vectors 
          must use a less efficient algorithm. *)
                                                             (* Destructively sorts Sequence.
                                                             Predicate should return non-Nil if 
                                                             Arg1 is to precede Arg2.
                                                             *)
         (CL:IF (ARRAYP SEQUENCE)
                (%%STABLE-SORT-SIMPLE-VECTOR SEQUENCE PREDICATE KEY)
                (CL:IF (VECTORP SEQUENCE)
                       (%%STABLE-SORT-VECTOR SEQUENCE PREDICATE KEY)
                       (CL:IF (LISTP SEQUENCE)
                              (%%SORT-LIST SEQUENCE PREDICATE KEY)
                              (CL:ERROR "~S is not a sequence."))))))

(%%STABLE-SORT-SIMPLE-VECTOR
  (CL:LAMBDA (VECTOR PRED KEY)                               (* kbr: " 4-Jun-86 17:26")
          
          (* Stable sorting arrays is hard. Knuth seems to think that finding an 
          algorithm which can stably sort a vector in n log n time without using gobs of 
          extra storage is a 47 point problem. We handle the problem by coercing the 
          vector into a list, sorting that, and then copying the list back into the 
          original vector. *)
                                                             (* This is an internal function.
                                                             Use STABLE-SORT instead.
                                                             *)
         (LET* ((HEADER (CONS (QUOTE HEADER)
                              NIL))
                (CL:LENGTH (CL:LENGTH VECTOR))
                (LIST (CL:DO ((I 0 (1+ I))
                              (TAIL HEADER (CDR (RPLACD TAIL (CONS (AREF VECTOR I)
                                                                   NIL)))))
                             ((= I CL:LENGTH)
                              (CDR HEADER)))))
               (CL:DO ((SORTED-LIST (%%SORT-LIST LIST PRED KEY)
                              (CDR SORTED-LIST))
                       (I 0 (1+ I)))
                      ((NULL SORTED-LIST)
                       VECTOR)
                      (SETF (AREF VECTOR I)
                            (CAR SORTED-LIST))))))

(%%STABLE-SORT-VECTOR
  (CL:LAMBDA (VECTOR PRED KEY)                               (* kbr: " 4-Jun-86 17:27")
                                                             (* %%STABLE-SORT-VECTOR is the same as 
                                                             %%STABLE-SORT-SIMPLE-VECTOR except 
                                                             that the vector is a slisp array 
                                                             instead of a slisp vector.
                                                             *)
         (LET* ((HEADER (CONS (QUOTE HEADER)
                              NIL))
                (CL:LENGTH (CL:LENGTH VECTOR))
                (LIST (CL:DO ((I 0 (1+ I))
                              (TAIL HEADER (CDR (RPLACD TAIL (CONS (AREF VECTOR I)
                                                                   NIL)))))
                             ((= I CL:LENGTH)
                              (CDR HEADER)))))
               (CL:DO ((SORTED-LIST (%%SORT-LIST LIST PRED KEY)
                              (CDR SORTED-LIST))
                       (I 0 (1+ I)))
                      ((NULL SORTED-LIST)
                       VECTOR)
                      (SETF (AREF VECTOR I)
                            (CAR SORTED-LIST))))))
)
(DEFINEQ

(CL:MERGE
  (CL:LAMBDA (RESULT-TYPE SEQUENCE1 SEQUENCE2 PREDICATE &KEY (KEY (FUNCTION IDENTITY)))
                                                             (* kbr: " 4-Jun-86 22:04")
                                                             (* The sequences SEQUENCE1 and 
                                                             SEQUENCE2 are destructively merged 
                                                             into a sequence of type RESULT-TYPE 
                                                             using the PREDICATE to order the 
                                                             elements. *)
         (CASE (TYPE-SPECIFIER RESULT-TYPE)
               (LIST (TYPECASE SEQUENCE1 (LIST (TYPECASE SEQUENCE2 (LIST (%%MERGE-LISTS* SEQUENCE1 
                                                                                SEQUENCE2 PREDICATE 
                                                                                KEY))
                                                      (ARRAY (%%MERGE-LISTS* SEQUENCE1 (
                                                                                      VECTOR-TO-LIST*
                                                                                        SEQUENCE2)
                                                                    PREDICATE KEY))
                                                      (T (CL:ERROR "~S is not a sequence." SEQUENCE2)
                                                         )))
                            (ARRAY (TYPECASE SEQUENCE2 (LIST (%%MERGE-LISTS* (VECTOR-TO-LIST* 
                                                                                    SEQUENCE1)
                                                                    SEQUENCE2 PREDICATE KEY))
                                          (ARRAY (%%MERGE-LISTS* (VECTOR-TO-LIST* SEQUENCE1)
                                                        (VECTOR-TO-LIST* SEQUENCE2)
                                                        PREDICATE KEY))
                                          (T (CL:ERROR "~S is not a sequence." SEQUENCE2))))
                            (T (CL:ERROR "~S is not a sequence." SEQUENCE1))))
               ((VECTOR ARRAY STRING)
                (TYPECASE SEQUENCE1 (LIST (TYPECASE SEQUENCE2 (LIST (%%MERGE-VECTORS*
                                                                     (LIST-TO-VECTOR* SEQUENCE1
                                                                            (QUOTE VECTOR))
                                                                     (LIST-TO-VECTOR* SEQUENCE2
                                                                            (QUOTE VECTOR))
                                                                     PREDICATE KEY))
                                                 (ARRAY (%%MERGE-VECTORS* (LIST-TO-VECTOR*
                                                                           SEQUENCE1
                                                                           (QUOTE VECTOR))
                                                               SEQUENCE2 PREDICATE KEY))
                                                 (T (CL:ERROR "~S is not a sequence." SEQUENCE2))))
                       (ARRAY (TYPECASE SEQUENCE2 (LIST (%%MERGE-VECTORS* SEQUENCE1
                                                               (LIST-TO-VECTOR* SEQUENCE2
                                                                      (QUOTE VECTOR))
                                                               PREDICATE KEY))
                                     (ARRAY (%%MERGE-VECTORS* SEQUENCE1 SEQUENCE2 PREDICATE KEY))
                                     (T (CL:ERROR "~S is not a sequence." SEQUENCE2))))
                       (T (CL:ERROR "~S is not a sequence." SEQUENCE1))))
               (T (CL:ERROR "~S is not a subtype of SEQUENCE." RESULT-TYPE)))))

(%%MERGE-LISTS*
  (CL:LAMBDA (LIST1 LIST2 PRED KEY)                          (* kbr: " 4-Jun-86 22:14")
                                                             (* %%MERGE-LISTS* destructively merges 
                                                             LIST1 with LIST2 In the resulting 
                                                             list, elements of LIST2 are guaranteed 
                                                             to come after equal elements of LIST1 
                                                             *)
         (CL:DO* ((RESULT (LIST (QUOTE HEADER)))
                  (P RESULT))
                ((OR (NULL LIST1)
                     (NULL LIST2))
                 (CL:IF (NULL LIST1)
                        (RPLACD P LIST2)
                        (RPLACD P LIST1))
                 (CDR RESULT))
          
          (* P = pointer to last cell of result. Done when either list used up in which 
          case, append the other list. Returns the result sans header.
          *)

                (COND
                   ((APPLY-PRED (CAR LIST2)
                           (CAR LIST1)
                           PRED KEY)
                    (RPLACD P LIST2)
          
          (* Append the lesser list to last cell of result.
          Note: test must bo done for LIST2 < LIST1 so merge will be stable for LIST1 *)

                    (SETQ P (CDR P))
                    (pop LIST2))
                   (T (RPLACD P LIST1)
                      (SETQ P (CDR P))
                      (pop LIST1))))))

(%%MERGE-VECTORS*
  (CL:LAMBDA (VECTOR1 VECTOR2 PRED KEY)                      (* kbr: " 4-Jun-86 22:33")
                                                             (* %%MERGE-VECTORS* dispatches to 
                                                             either %%MERGE-SIMPLE-VECTORS or 
                                                             %%MERGE-NON-SIMPLE-VECTORS *)
         (CL:IF (OR (ARRAYP VECTOR1)
                    (ARRAYP VECTOR2))
                (%%MERGE-NON-SIMPLE-VECTORS VECTOR1 VECTOR2 PRED KEY)
                (%%MERGE-SIMPLE-VECTORS VECTOR1 VECTOR2 PRED KEY))))

(%%MERGE-SIMPLE-VECTORS
  (CL:LAMBDA (VECTOR1 VECTOR2 PRED KEY)                      (* kbr: " 4-Jun-86 22:13")
          
          (* Merge-simple-vectors returns a new vector which contains an interleaving of 
          the elements of VECTOR1 and VECTOR2 Elements from VECTOR2 are chosen only if 
          they are strictly less than elements of VECTOR1
          (PRED ELT2 ELT1) %%, as specified in the manual.
          *)

         (CL:DECLARE (SIMPLE-VECTOR VECTOR1 VECTOR2))
         (CL:DO* ((LENGTH1 (CL:LENGTH VECTOR1))
                  (LENGTH2 (CL:LENGTH VECTOR2))
                  (RESULTLENGTH (+ LENGTH1 LENGTH2))
                  (RESULT (MAKE-ARRAY RESULTLENGTH :ELEMENT-TYPE (ARRAY-ELEMENT-TYPE VECTOR1)))
                  (FILL 0 (1+ FILL))
                  (I 0)
                  (J 0))
                ((>= FILL RESULTLENGTH)
                 RESULT)                                     (* FILL = index into result vector * I 
                                                             = index into VECTOR1 * J = index into 
                                                             VECTOR2 *)
                (COND
                   ((= I LENGTH1)
                    (CL:DO NIL ((= FILL RESULTLENGTH)
                                RESULT)
                           (SETF (AREF RESULT FILL)
                                 (AREF VECTOR2 J))
                           (SETQ FILL (1+ FILL))
                           (SETQ J (1+ J))))
                   ((= J LENGTH2)
                    (CL:DO NIL ((= FILL RESULTLENGTH)
                                RESULT)
                           (SETF (AREF RESULT FILL)
                                 (AREF VECTOR1 I))
                           (SETQ FILL (1+ FILL))
                           (SETQ I (1+ I))))
                   ((APPLY-PRED (AREF VECTOR2 J)
                           (AREF VECTOR1 I)
                           PRED KEY)
                    (SETF (AREF RESULT FILL)
                          (AREF VECTOR2 J))
                    (SETQ J (1+ J)))
                   (T (SETF (AREF RESULT FILL)
                            (AREF VECTOR1 I))
                      (SETQ I (1+ I)))))))

(%%MERGE-NON-SIMPLE-VECTORS
  (CL:LAMBDA (VECTOR1 VECTOR2 PRED KEY)                      (* kbr: " 4-Jun-86 22:27")
                                                             (* %%MERGE-NON-SIMPLE-VECTORS is like 
                                                             %%MERGE-SIMPLE-VECTORS except that the 
                                                             vectors are either slisp arrays or 
                                                             slisp vectors. *)
         (CL:DO* ((LENGTH1 (CL:LENGTH VECTOR1))
                  (LENGTH2 (CL:LENGTH VECTOR2))
                  (RESULTLENGTH (+ (CL:LENGTH VECTOR1)
                                   (CL:LENGTH VECTOR2)))
                  (RESULT (MAKE-ARRAY RESULTLENGTH :ELEMENT-TYPE (ARRAY-ELEMENT-TYPE VECTOR1)))
                  (FILL 0 (1+ FILL))
                  (I 0)
                  (J 0))
                ((>= FILL RESULTLENGTH)
                 RESULT)
                (CL:DECLARE (VECTOR RESULT))                 (* FILL = index into result vector * I 
                                                             = index into VECTOR1 * J = index into 
                                                             VECTOR2 *)
                (COND
                   ((= I LENGTH1)
                    (CL:DO NIL ((= FILL RESULTLENGTH)
                                RESULT)
                           (SETF (AREF RESULT FILL)
                                 (AREF VECTOR2 J))
                           (SETQ FILL (1+ FILL))
                           (SETQ J (1+ J))))
                   ((= J LENGTH2)
                    (CL:DO NIL ((= FILL RESULTLENGTH)
                                RESULT)
                           (SETF (AREF RESULT FILL)
                                 (AREF VECTOR1 I))
                           (SETQ FILL (1+ FILL))
                           (SETQ I (1+ I))))
                   ((APPLY-PRED (AREF VECTOR2 J)
                           (AREF VECTOR1 I)
                           PRED KEY)
                    (SETF (AREF RESULT FILL)
                          (AREF VECTOR2 J))
                    (SETQ J (1+ J)))
                   (T (SETF (AREF RESULT FILL)
                            (AREF VECTOR1 I))
                      (SETQ I (1+ I)))))))
)
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML )

(ADDTOVAR LAMA %%MERGE-NON-SIMPLE-VECTORS %%MERGE-SIMPLE-VECTORS %%MERGE-VECTORS* %%MERGE-LISTS* 
                     CL:MERGE %%STABLE-SORT-VECTOR %%STABLE-SORT-SIMPLE-VECTOR STABLE-SORT 
                     %%SORT-LIST %%SORT-VECTOR %%SORT-SIMPLE-VECTOR CL:SORT)
)
(PUTPROPS CMLSORT COPYRIGHT ("Xerox Corporation" 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (5363 13049 (CL:SORT 5373 . 6705) (%%SORT-SIMPLE-VECTOR 6707 . 9755) (%%SORT-VECTOR 9757
 . 12450) (%%SORT-LIST 12452 . 13047)) (13050 17060 (STABLE-SORT 13060 . 14190) (
%%STABLE-SORT-SIMPLE-VECTOR 14192 . 15725) (%%STABLE-SORT-VECTOR 15727 . 17058)) (17061 27910 (
CL:MERGE 17071 . 21070) (%%MERGE-LISTS* 21072 . 22708) (%%MERGE-VECTORS* 22710 . 23343) (
%%MERGE-SIMPLE-VECTORS 23345 . 25582) (%%MERGE-NON-SIMPLE-VECTORS 25584 . 27908)))))
STOP