1 ;;;;------------------------------------------------------------------
3 ;;;; Copyright (C) 2001-2005,
4 ;;;; Department of Computer Science, University of Tromso, Norway.
6 ;;;; For distribution policy, see the accompanying file COPYING.
8 ;;;; Filename: sequences.lisp
10 ;;;; Author: Frode Vatvedt Fjeld <frodef@acm.org>
11 ;;;; Created at: Tue Sep 11 14:19:23 2001
13 ;;;; $Id: sequences.lisp,v 1.37 2007/04/07 20:14:45 ffjeld Exp $
15 ;;;;------------------------------------------------------------------
17 (require :muerte
/basic-macros
)
18 (provide :muerte
/sequences
)
26 (defmacro sequence-dispatch
(sequence-var (type0 &body forms0
) (type1 &body forms1
))
28 ((and (eq 'list type0
) (eq 'vector type1
))
29 `(if (typep ,sequence-var
'list
)
31 (progn (check-type ,sequence-var vector
)
33 ((and (eq 'vector type0
) (eq 'list type1
))
34 `(if (not (typep ,sequence-var
'list
))
35 (progn (check-type ,sequence-var vector
)
38 (t (error "sequence-dispatch only understands list and vector types, not ~W and ~W."
41 (defun sequence-double-dispatch-error (seq0 seq1
)
42 (error "The type-set (~A, ~A) has not been implemented in this sequence-double-dispatch."
46 (defmacro sequence-double-dispatch
((seq0 seq1
) &rest clauses
)
47 `(case (logior (if (typep ,seq0
'list
) 2 0)
48 (if (typep ,seq1
'list
) 1 0))
49 ,@(loop for
((type0 type1
) . forms
) in clauses
50 as index
= (logior (ecase type0
(list 2) (vector 0))
51 (ecase type1
(list 1) (vector 0)))
54 (t (sequence-double-dispatch-error ,seq0
,seq1
))))
56 (defun length (sequence)
59 (do ((x sequence
(cdr x
))
60 (length 0 (1+ length
)))
62 (declare (index length
))))
64 (memref sequence
(movitz-type-slot-offset 'movitz-basic-vector
'data
)
69 `(with-inline-assembly (:returns
:eax
)
70 (:compile-form
(:result-mode
:ebx
) sequence
)
71 (:movl
(:ebx
(:offset movitz-basic-vector num-elements
))
73 (:testl
,(logxor #xffffffff
(1- (expt 2 14))) :eax
)
74 (:jnz
'basic-vector-length-ok
)
75 (:movzxw
(:ebx
(:offset movitz-basic-vector fill-pointer
))
77 basic-vector-length-ok
)))
80 (defun length%list
(sequence)
81 (do ((length 0 (1+ length
))
84 (declare (type index length
))))
86 (defun elt (sequence index
)
87 (sequence-dispatch sequence
88 (vector (aref sequence index
))
89 (list (nth index sequence
))))
91 (defun (setf elt
) (value sequence index
)
92 (sequence-dispatch sequence
93 (vector (setf (aref sequence index
) value
))
94 (list (setf (nth index sequence
) value
))))
96 (defun reduce (function sequence
&key
(key 'identity
) from-end
97 (start 0) (end (length sequence
))
98 (initial-value nil initial-value-p
))
100 (2 (function sequence
)
101 (with-funcallable (funcall-function function
)
102 (sequence-dispatch sequence
107 ((null (cdr sequence
))
109 (t (do* ((list sequence
)
110 (result (funcall-function (pop list
) (pop list
))
111 (funcall-function result
(pop list
))))
115 (let ((end (length sequence
)))
117 (0 (funcall-function))
118 (1 (aref sequence
0))
119 (t (with-subvector-accessor (sequence-ref sequence
0 end
)
121 (result (funcall-function (sequence-ref (prog1 index
(incf index
)))
122 (sequence-ref (prog1 index
(incf index
))))
123 (funcall-function result
(sequence-ref (prog1 index
(incf index
))))))
124 ((= index end
) result
)
125 (declare (index index
)))))))))))
126 (t (function sequence
&key
(key 'identity
) from-end
128 (initial-value nil initial-value-p
))
129 (let ((start (check-the index start
)))
130 (with-funcallable (funcall-function function
)
131 (with-funcallable (key)
132 (sequence-dispatch sequence
134 (let ((list (nthcdr start sequence
)))
142 (funcall-function initial-value
(key (car list
)))
146 (do ((result (funcall-function (if initial-value-p
150 (funcall-function result
(key (pop list
)))))
151 ((null list
) result
))
152 (do ((counter (1+ start
) (1+ counter
))
153 (result (funcall-function (if initial-value-p
157 (funcall-function result
(key (pop list
)))))
161 (declare (index counter
)))))
163 (do* ((end (or end
(+ start
(length list
))))
164 (counter (1+ start
) (1+ counter
))
165 (list (nreverse (subseq sequence start end
)))
166 (result (funcall-function (key (pop list
))
170 (funcall-function (key (pop list
)) result
)))
174 (declare (index counter
)))))))
177 (error "REDUCE from-end on vectors is not implemented."))
178 (let ((end (or (check-the index end
)
181 (0 (if initial-value-p
184 (1 (if initial-value-p
185 (funcall-function initial-value
(key (elt sequence start
)))
186 (key (elt sequence start
))))
187 (t (with-subvector-accessor (sequence-ref sequence start end
)
189 (result (funcall-function (if initial-value-p
191 (key (sequence-ref (prog1 index
(incf index
)))))
192 (key (sequence-ref (prog1 index
(incf index
)))))
193 (funcall-function result
(sequence-ref (prog1 index
(incf index
))))))
194 ((= index end
) result
)
195 (declare (index index
)))))))))))))))
197 (defun subseq (sequence start
&optional end
)
198 (sequence-dispatch sequence
201 (setf end
(length sequence
)))
202 (with-subvector-accessor (old-ref sequence start end
)
203 (let ((new-vector (make-array (- end start
) :element-type
(array-element-type sequence
))))
204 (replace new-vector sequence
:start2 start
:end2 end
)
205 #+ignore
(with-subvector-accessor (new-ref new-vector
)
206 (do ((i start
(1+ i
))
208 ((>= i end
) new-vector
)
209 (setf (new-ref j
) (old-ref i
))))
212 (let ((list-start (nthcdr start sequence
)))
215 (copy-list list-start
))
217 (error "Start ~A is greater than end ~A." start end
))
218 ((endp list-start
) nil
)
220 (t (do* ((p (cdr list-start
) (cdr p
))
221 (i (1+ start
) (1+ i
))
222 (head (cons (car list-start
) nil
))
224 ((or (endp p
) (>= i end
)) head
)
226 (setf (cdr tail
) (cons (car p
) nil
)
227 tail
(cdr tail
)))))))))
229 (defsetf subseq
(sequence start
&optional
(end nil end-p
)) (new-sequence)
230 `(progn (replace ,sequence
,new-sequence
:start1
,start
231 ,@(when end-p
`(:end1
,end
)))
234 (defun copy-seq (sequence)
237 (defun position (item sequence
&key from-end
(test #'eql
) test-not
(start 0) end
(key 'identity
))
240 (sequence-dispatch sequence
242 (with-subvector-accessor (sequence-ref sequence
)
243 (do ((end (length sequence
))
246 (declare (index i end
))
247 (when (eql (sequence-ref i
) item
)
251 ((null sequence
) nil
)
253 (when (eql (pop sequence
) item
)
255 (t (item sequence
&key from-end
(test #'eql
) test-not
(start 0) end
(key 'identity
))
256 (with-funcallable (key)
257 (with-funcallable (test)
258 (sequence-dispatch sequence
261 (setf end
(length sequence
)))
262 (with-subvector-accessor (sequence-ref sequence start end
)
265 (do ((i start
(1+ i
)))
268 (when (test (key (sequence-ref i
)) item
)
270 (t (do ((i (1- end
) (1- i
)))
273 (when (test (key (sequence-ref i
)) item
)
278 (do ((p (nthcdr start sequence
))
282 (when (test (key (pop p
)) item
)
283 (return (if (not from-end
)
285 (let ((next-i (position item p
:key key
:from-end t
286 :test test
:test-not test-not
)))
287 (if next-i
(+ i
1 next-i
) i
)))))))
288 (t (do ((p (nthcdr start sequence
))
290 ((or (null p
) (>= i end
)) nil
)
292 (when (test (key (pop p
)) item
)
293 (return (if (not from-end
) i
294 (let ((next-i (position item p
:end
(- end
1 i
) :from-end t
295 :key key
:test test
:test-not test-not
)))
296 (if next-i
(+ i
1 next-i
) i
)))))))))))))))
298 (defun position-if (predicate sequence
&key
(start 0) end
(key 'identity
) from-end
)
300 (2 (predicate sequence
)
301 (with-funcallable (predicate)
302 (sequence-dispatch sequence
304 (with-subvector-accessor (sequence-ref sequence
)
305 (do ((end (length sequence
))
308 (declare (index i end
))
309 (when (predicate (sequence-ref i
))
316 (when (predicate (pop p
))
318 (t (predicate sequence
&key
(start 0) end
(key 'identity
) from-end
)
319 (with-funcallable (predicate)
320 (with-funcallable (key)
321 (sequence-dispatch sequence
323 (setf end
(or end
(length sequence
)))
324 (with-subvector-accessor (sequence-ref sequence start end
)
327 (do ((i start
(1+ i
)))
330 (when (predicate (key (sequence-ref i
)))
332 (t (do ((i (1- end
) (1- i
)))
335 (when (predicate (key (sequence-ref i
)))
340 (do ((p (nthcdr start sequence
))
342 ((or (>= i end
) (null p
)))
344 (when (predicate (key (pop p
)))
345 (return (if (not from-end
) i
346 (let ((next-i (position-if predicate p
:key key
347 :from-end t
:end
(- end i
1))))
348 (if next-i
(+ i
1 next-i
) i
)))))))
349 (t (do ((p (nthcdr start sequence
))
353 (when (predicate (key (pop p
)))
354 (return (if (not from-end
) i
355 (let ((next-i (position-if predicate p
:key key
:from-end t
)))
356 (if next-i
(+ i
1 next-i
) i
)))))))))))))))
358 (defun position-if-not (predicate sequence
&rest key-args
)
359 (declare (dynamic-extent key-args
))
360 (apply #'position-if
(complement predicate
) sequence key-args
))
362 (defun nreverse (sequence)
363 (sequence-dispatch sequence
365 (do ((prev-cons nil current-cons
)
366 (next-cons (cdr sequence
) (cdr next-cons
))
367 (current-cons sequence next-cons
))
368 ((null current-cons
) prev-cons
)
369 (setf (cdr current-cons
) prev-cons
)))
371 (with-subvector-accessor (sequence-ref sequence
)
373 (j (1- (length sequence
)) (1- j
)))
375 (declare (index i j
))
376 (let ((x (sequence-ref i
)))
377 (setf (sequence-ref i
) (sequence-ref j
)
378 (sequence-ref j
) x
))))
381 (defun reverse (sequence)
382 (sequence-dispatch sequence
389 (nreverse (copy-seq sequence
)))))
391 (defun mismatch-eql-identity (sequence-1 sequence-2 start1 start2 end1 end2
)
392 (sequence-dispatch sequence-1
394 (unless end1
(setf end1
(length sequence-1
)))
395 (with-subvector-accessor (seq1-ref sequence-1 start1 end1
)
396 (sequence-dispatch sequence-2
398 (unless end2
(setf end2
(length sequence-2
)))
399 (with-subvector-accessor (seq2-ref sequence-2 start2 end2
)
400 (macrolet ((test-return (index1 index2
)
401 `(unless (eql (seq1-ref ,index1
) (seq2-ref ,index2
))
403 (let ((length1 (- end1 start1
))
404 (length2 (- end2 start2
)))
407 (do* ((i start1
(1+ i
))
410 (declare (index i j
))
413 (do* ((i start1
(1+ i
))
416 (declare (index i j
))
419 (do* ((i start1
(1+ i
))
422 (declare (index i j
))
423 (test-return i j
))))))))
425 (let ((length1 (- end1 start1
))
426 (start-cons2 (nthcdr start2 sequence-2
)))
428 ((and (zerop length1
) (null start-cons2
))
429 (if (and end2
(> end2 start2
)) start1 nil
))
431 (do ((i1 start1
(1+ i1
))
432 (p2 start-cons2
(cdr p2
)))
433 ((>= i1 end1
) (if (null p2
) nil i1
))
435 (unless (and p2
(eql (seq1-ref i1
) (car p2
)))
437 ((< length1
(- end2 start2
))
438 (do ((i1 start1
(1+ i1
))
439 (p2 start-cons2
(cdr p2
)))
442 (unless (eql (seq1-ref i1
) (car p2
))
444 ((> length1
(- end2 start2
))
445 (do ((i1 start1
(1+ i1
))
446 (p2 start-cons2
(cdr p2
)))
449 (unless (eql (seq1-ref i1
) (car p2
))
451 (t (do ((i1 start1
(1+ i1
))
452 (p2 start-cons2
(cdr p2
)))
455 (unless (eql (seq1-ref i1
) (car p2
))
458 (sequence-dispatch sequence-2
460 (let ((mismatch-2 (mismatch-eql-identity sequence-2 sequence-1 start2 start1 end2 end1
)))
463 (+ start1
(- mismatch-2 start2
)))))
465 (let ((start-cons1 (nthcdr start1 sequence-1
))
466 (start-cons2 (nthcdr start2 sequence-2
)))
467 (assert (and start-cons1 start-cons2
) (start1 start2
) "Illegal bounding indexes.")
469 ((and (not end1
) (not end2
))
470 (do ((p1 start-cons1
(cdr p1
))
471 (p2 start-cons2
(cdr p2
))
473 ((null p1
) (if (null p2
) nil i1
))
475 (unless (and p2
(eql (car p1
) (car p2
)))
477 (t (do ((p1 start-cons1
(cdr p1
))
478 (p2 start-cons2
(cdr p2
))
481 ((if end1
(>= i1 end1
) (null p1
))
482 (if (if end2
(>= i2 end2
) (null p2
)) nil i1
))
483 (declare (index i1 i2
))
484 (unless (and (or (not end2
) (< i1 end2
))
485 (eql (car p1
) (car p2
)))
486 (return i1
)))))))))))
488 (define-compiler-macro mismatch
(&whole form sequence-1 sequence-2
489 &key
(start1 0) (start2 0) end1 end2
490 (test 'eql test-p
) (key 'identity key-p
) from-end
)
491 (declare (ignore key test
))
493 ((and (not test-p
) (not key-p
))
494 (assert (not from-end
) ()
495 "Mismatch :from-end not implemented.")
496 `(mismatch-eql-identity ,sequence-1
,sequence-2
,start1
,start2
,end1
,end2
))
499 (defun mismatch (sequence-1 sequence-2
&key
(start1 0) (start2 0) end1 end2
500 (test 'eql
) (key 'identity
) from-end
)
503 (mismatch-eql-identity s1 s2
0 0 nil nil
))
504 (t (sequence-1 sequence-2
&key
(start1 0) (start2 0) end1 end2
505 (test 'eql
) (key 'identity
) from-end
)
506 (assert (not from-end
) ()
507 "Mismatch :from-end not implemented.")
508 (with-funcallable (test)
509 (with-funcallable (key)
510 (sequence-dispatch sequence-1
512 (unless end1
(setf end1
(length sequence-1
)))
513 (with-subvector-accessor (sequence-1-ref sequence-1 start1 end1
)
514 (sequence-dispatch sequence-2
516 (let ((end2 (check-the index
(or end2
(length sequence-2
)))))
517 (with-subvector-accessor (sequence-2-ref sequence-2 start2 end2
)
518 (macrolet ((test-return (index1 index2
)
519 `(unless (test (key (sequence-1-ref ,index1
))
520 (key (sequence-2-ref ,index2
)))
521 (return-from mismatch
,index1
))))
522 (let ((length1 (- end1 start1
))
523 (length2 (- end2 start2
)))
528 (test-return (+ start1 i
) (+ start2 i
)))
533 (test-return (+ start1 i
) (+ start2 i
)))
535 (t (dotimes (i length1
)
537 (test-return (+ start1 i
) (+ start2 i
)))
540 (let ((length1 (- end1 start1
))
541 (start-cons2 (nthcdr start2 sequence-2
)))
543 ((and (zerop length1
) (null start-cons2
))
544 (if (and end2
(> end2 start2
)) start1 nil
))
546 (do ((i1 start1
(1+ i1
))
547 (p2 start-cons2
(cdr p2
)))
548 ((>= i1 end1
) (if (null p2
) nil i1
))
550 (unless (and p2
(test (key (sequence-1-ref i1
)) (key (car p2
))))
551 (return-from mismatch i1
))))
552 ((< length1
(- end2 start2
))
553 (do ((i1 start1
(1+ i1
))
554 (p2 start-cons2
(cdr p2
)))
557 (unless (test (key (sequence-1-ref i1
)) (key (car p2
)))
558 (return-from mismatch i1
))))
559 ((> length1
(- end2 start2
))
560 (do ((i1 start1
(1+ i1
))
561 (p2 start-cons2
(cdr p2
)))
564 (unless (test (key (sequence-1-ref i1
)) (key (car p2
)))
565 (return-from mismatch i1
))))
566 (t (do ((i1 start1
(1+ i1
))
567 (p2 start-cons2
(cdr p2
)))
570 (unless (test (key (sequence-1-ref i1
)) (key (car p2
)))
571 (return-from mismatch i1
))))))))))
573 (sequence-dispatch sequence-2
575 (let ((mismatch-2 (mismatch sequence-2 sequence-1
:from-end from-end
:test test
:key key
576 :start1 start2
:end1 end2
:start2 start1
:end2 end1
)))
579 (+ start1
(- mismatch-2 start2
)))))
581 (let ((start-cons1 (nthcdr start1 sequence-1
))
582 (start-cons2 (nthcdr start2 sequence-2
)))
583 (assert (and start-cons1 start-cons2
) (start1 start2
) "Illegal bounding indexes.")
585 ((and (not end1
) (not end2
))
586 (do ((p1 start-cons1
(cdr p1
))
587 (p2 start-cons2
(cdr p2
))
589 ((null p1
) (if (null p2
) nil i1
))
591 (unless (and p2
(test (key (car p1
)) (key (car p2
))))
593 (t (do ((p1 start-cons1
(cdr p1
))
594 (p2 start-cons2
(cdr p2
))
597 ((if end1
(>= i1 end1
) (null p1
))
598 (if (if end2
(>= i2 end2
) (null p2
)) nil i1
))
599 (declare (index i1 i2
))
602 (error "Illegal end2 bounding index.")
604 (unless (and (or (not end2
) (< i1 end2
))
605 (test (key (car p1
)) (key (car p2
))))
606 (return i1
)))))))))))))))
608 (defun map-into (result-sequence function first-sequence
&rest more-sequences
)
609 (declare (dynamic-extent more-sequences
))
610 (assert (null more-sequences
) ()
611 "MAP-INTO not implemented.")
612 (with-funcallable (map function
)
613 (sequence-double-dispatch (result-sequence first-sequence
)
615 (let ((length (min (length result-sequence
)
616 (length first-sequence
))))
617 (with-subvector-accessor (result-ref result-sequence
0 length
)
618 (with-subvector-accessor (first-sequence-ref first-sequence
0 length
)
619 (dotimes (i length result-sequence
)
621 (map (first-sequence-ref i
))))))))
623 (do ((p result-sequence
(cdr p
))
624 (q first-sequence
(cdr q
)))
625 ((or (null p
) (null q
))
627 (setf (car p
) (map (car q
)))))
629 (with-subvector-accessor (result-ref result-sequence
)
630 (do ((end (length result-sequence
))
632 (p first-sequence
(cdr p
)))
633 ((or (endp p
) (>= i end
)) result-sequence
)
635 (setf (result-ref i
) (map (car p
))))))
637 (with-subvector-accessor (first-ref first-sequence
)
638 (do ((end (length first-sequence
))
640 (p result-sequence
(cdr p
)))
641 ((or (endp p
) (>= i end
)) result-sequence
)
643 (setf (car p
) (map (first-ref i
)))))))))
645 (defun map-for-nil (function first-sequence
&rest more-sequences
)
647 (2 (function first-sequence
)
648 (with-funcallable (mapf function
)
649 (sequence-dispatch first-sequence
651 (dolist (x first-sequence
)
654 (with-subvector-accessor (sequence-ref first-sequence
)
655 (dotimes (i (length first-sequence
))
656 (mapf (sequence-ref i
))))))))
657 (3 (function first-sequence second-sequence
)
658 (with-funcallable (mapf function
)
659 (sequence-double-dispatch (first-sequence second-sequence
)
661 (do ((p first-sequence
(cdr p
))
662 (q second-sequence
(cdr q
)))
663 ((or (endp p
) (endp q
)))
664 (mapf (car p
) (car q
))))
666 (with-subvector-accessor (first-sequence-ref first-sequence
)
667 (with-subvector-accessor (second-sequence-ref second-sequence
)
668 (do ((len1 (length first-sequence
))
669 (len2 (length second-sequence
))
674 (declare (index i j
))
675 (mapf (first-sequence-ref i
) (second-sequence-ref j
))))))
677 (t (function first-sequence
&rest more-sequences
)
678 (declare (ignore function first-sequence more-sequences
))
679 (error "MAP not implemented."))))
681 (defun map-for-list (function first-sequence
&rest more-sequences
)
683 (2 (function first-sequence
)
684 (with-funcallable (mapf function
)
685 (sequence-dispatch first-sequence
687 (mapcar function first-sequence
))
689 (with-subvector-accessor (sequence-ref first-sequence
)
691 (dotimes (i (length first-sequence
))
692 (push (mapf (sequence-ref i
))
694 (nreverse result
)))))))
695 (3 (function first-sequence second-sequence
)
696 (sequence-double-dispatch (first-sequence second-sequence
)
698 (mapcar function first-sequence second-sequence
))
700 (with-funcallable (mapf function
)
701 (with-subvector-accessor (first-sequence-ref first-sequence
)
702 (with-subvector-accessor (second-sequence-ref second-sequence
)
704 (len1 (length first-sequence
))
705 (len2 (length second-sequence
))
711 (declare (index i j
))
712 (push (mapf (first-sequence-ref i
) (second-sequence-ref j
))
715 (with-funcallable (mapf function
)
716 (with-subvector-accessor (second-sequence-ref second-sequence
)
718 (len2 (length second-sequence
))
719 (p first-sequence
(cdr p
))
721 ((or (endp p
) (>= j len2
))
724 (push (mapf (car p
) (second-sequence-ref j
))
727 (with-funcallable (mapf function
)
728 (with-subvector-accessor (first-sequence-ref first-sequence
)
730 (len1 (length first-sequence
))
731 (p second-sequence
(cdr p
))
733 ((or (endp p
) (>= j len1
))
736 (push (mapf (first-sequence-ref j
) (car p
))
738 (t (function first-sequence
&rest more-sequences
)
739 (declare (dynamic-extent more-sequences
)
740 (ignore function first-sequence more-sequences
))
741 (error "MAP not implemented."))))
743 (defun map-for-vector (result function first-sequence
&rest more-sequences
)
745 (3 (result function first-sequence
)
746 (with-funcallable (mapf function
)
747 (sequence-dispatch first-sequence
750 ((>= i
(length result
)) result
)
752 (setf (aref result i
) (mapf (aref first-sequence i
)))))
755 ((>= i
(length result
)) result
)
757 (setf (aref result i
) (mapf (pop first-sequence
))))))))
758 (t (function first-sequence
&rest more-sequences
)
759 (declare (ignore function first-sequence more-sequences
))
760 (error "MAP not implemented."))))
763 (defun map (result-type function first-sequence
&rest more-sequences
)
765 (declare (dynamic-extent more-sequences
))
768 (apply 'map-for-nil function first-sequence more-sequences
))
769 ((eq 'list result-type
)
770 (apply 'map-for-list function first-sequence more-sequences
))
771 ((member result-type
'(string simple-string
))
772 (apply 'map-for-vector
773 (make-string (length first-sequence
))
774 function first-sequence more-sequences
))
775 ((member result-type
'(vector simple-vector
))
776 (apply 'map-for-vector
777 (make-array (length first-sequence
))
778 function first-sequence more-sequences
))
779 (t (error "MAP not implemented."))))
781 (defun fill (sequence item
&key
(start 0) end
)
783 (let ((start (check-the index start
)))
786 (do ((p (nthcdr start sequence
) (cdr p
))
788 ((or (null p
) (and end
(>= i end
))))
790 (setf (car p
) item
)))
791 ((simple-array (unsigned-byte 32) 1)
792 (let* ((length (array-dimension sequence
0))
793 (end (or end length
)))
794 (unless (<= 0 end length
)
795 (error 'index-out-of-range
:index end
:range length
))
796 (do ((i start
(1+ i
)))
799 (setf (memref sequence
(movitz-type-slot-offset 'movitz-basic-vector
'data
)
801 :type
:unsigned-byte32
)
804 (let ((end (or end
(length sequence
))))
805 (with-subvector-accessor (sequence-ref sequence start end
)
806 (do ((i start
(1+ i
)))
809 (setf (sequence-ref i
) item
)))))))
812 (defun replace (sequence-1 sequence-2
&key
(start1 0) end1
(start2 0) end2
)
813 (let ((start1 (check-the index start1
))
814 (start2 (check-the index start2
)))
816 ((and (eq sequence-1 sequence-2
)
817 (<= start2 start1
(or end2 start1
)))
818 (if (= start1 start2
)
819 sequence-1
; no need to copy anything
820 ;; must copy in reverse direction
821 (sequence-dispatch sequence-1
823 (let ((l (length sequence-1
)))
824 (setf end1
(or end1 l
)
826 (assert (<= 0 start2 end2 l
)))
827 (with-subvector-accessor (sequence-1-ref sequence-1 start1 end1
)
828 (do* ((length (min (- end1 start1
) (- end2 start2
)))
829 (i (+ start1 length -
1) (1- i
))
830 (j (+ start2 length -
1) (1- j
)))
831 ((< i start1
) sequence-1
)
832 (declare (index i j length
))
833 (setf (sequence-1-ref i
)
834 (sequence-1-ref j
)))))
836 (let* ((length (length sequence-1
))
837 (reverse-list (nreverse sequence-1
))
838 (size (min (- (or end1 length
) start1
) (- (or end2 length
) start2
))))
839 (do ((p (nthcdr (- length start1 size
) reverse-list
) (cdr p
))
840 (q (nthcdr (- length start2 size
) reverse-list
) (cdr q
))
842 ((>= i size
) (nreverse reverse-list
))
844 (setf (car p
) (car q
))))))))
845 ;; (not (eq sequence-1 sequence-2)) ..
846 (t (sequence-dispatch sequence-1
848 (setf end1
(or end1
(length sequence-1
)))
849 (sequence-dispatch sequence-2
851 (setf end2
(or end2
(length sequence-2
)))
852 (with-subvector-accessor (sequence-1-ref sequence-1 start1 end1
)
853 (with-subvector-accessor (sequence-2-ref sequence-2 start2 end2
)
855 ((< (- end1 start1
) (- end2 start2
))
856 (do ((i start1
(1+ i
))
858 ((>= i end1
) sequence-1
)
859 (declare (index i j
))
860 (setf (sequence-1-ref i
) (sequence-2-ref j
))))
861 (t (do ((i start1
(1+ i
))
863 ((>= j end2
) sequence-1
)
864 (declare (index i j
))
865 (setf (sequence-1-ref i
) (sequence-2-ref j
))))))))
867 (with-subvector-accessor (sequence-1-ref sequence-1 start1 end1
)
869 (do ((i start1
(1+ i
))
870 (p (nthcdr start2 sequence-2
) (cdr p
)))
871 ((or (null p
) (>= i end1
)) sequence-1
)
873 (setf (sequence-1-ref i
) (car p
)))
874 (do ((i start1
(1+ i
))
876 (p (nthcdr start2 sequence-2
) (cdr p
)))
877 ((or (>= i end1
) (endp p
) (>= j end2
)) sequence-1
)
878 (declare (index i j
))
879 (setf (sequence-1-ref i
) (car p
))))))))
881 (sequence-dispatch sequence-2
883 (setf end2
(or end2
(length sequence-2
)))
884 (with-subvector-accessor (sequence-2-ref sequence-2 start2 end2
)
885 (do ((p (nthcdr start1 sequence-1
) (cdr p
))
888 ((or (endp p
) (>= j end2
) (and end1
(>= i end1
)))
890 (declare (index i j
))
891 (setf (car p
) (sequence-2-ref j
)))))
893 (do ((i start1
(1+ i
))
895 (p (nthcdr start1 sequence-1
) (cdr p
))
896 (q (nthcdr start2 sequence-2
) (cdr q
)))
897 ((or (endp p
) (endp q
)
898 (and end1
(>= i end1
))
899 (and end2
(>= j end2
)))
901 (declare (index i j
))
902 (setf (car p
) (car q
)))))))
905 (defun find (item sequence
&key from-end
(test 'eql
) (start 0) end
(key 'identity
))
908 (sequence-dispatch sequence
910 (with-subvector-accessor (sequence-ref sequence
)
911 (dotimes (i (length sequence
))
912 (when (eql item
(sequence-ref i
))
918 (t (item sequence
&key from-end
(test 'eql
) (start 0) end
(key 'identity
))
919 (let ((start (check-the index start
)))
920 (with-funcallable (test)
921 (with-funcallable (key)
922 (sequence-dispatch sequence
924 (setf end
(or end
(length sequence
)))
925 (with-subvector-accessor (sequence-ref sequence start end
)
927 (do ((i start
(1+ i
)))
930 (when (test item
(key (aref sequence i
)))
931 (return (sequence-ref i
))))
932 (do ((i (1- end
) (1- i
)))
935 (when (test item
(key (sequence-ref i
)))
936 (return (sequence-ref i
)))))))
939 (do ((p (nthcdr start sequence
) (cdr p
))
941 ((or (>= i end
) (endp p
)) nil
)
943 (when (test item
(key (car p
)))
944 (return (or (and from-end
946 :from-end t
:test test
947 :key key
:end
(- end i
1)))
949 (do ((p (nthcdr start sequence
) (cdr p
)))
951 (when (test item
(key (car p
)))
952 (return (or (and from-end
(find item
(cdr p
) :from-end t
:test test
:key key
))
956 (defun find-if (predicate sequence
&key from-end
(start 0) end
(key 'identity
))
958 (2 (predicate sequence
)
959 (with-funcallable (predicate)
960 (sequence-dispatch sequence
962 (let ((end (length sequence
)))
963 (with-subvector-accessor (sequence-ref sequence
0 end
)
967 (let ((x (sequence-ref i
)))
968 (when (predicate x
) (return x
)))))))
970 (do ((p sequence
(cdr p
)))
973 (when (predicate x
) (return x
))))))))
974 (t (predicate sequence
&key from-end
(start 0) end
(key 'identity
))
975 (let ((start (check-the index start
)))
976 (with-funcallable (predicate)
977 (with-funcallable (key)
978 (sequence-dispatch sequence
980 (setf end
(or end
(length sequence
)))
981 (with-subvector-accessor (sequence-ref sequence start end
)
984 (do ((i start
(1+ i
)))
987 (when (predicate (key (sequence-ref i
)))
988 (return (sequence-ref i
)))))
989 (t (do ((i (1- end
) (1- i
)))
992 (when (predicate (key (sequence-ref i
)))
993 (return (sequence-ref i
))))))))
997 (do ((p (nthcdr start sequence
) (cdr p
))
999 ((or (>= i end
) (endp p
)) nil
)
1001 (when (predicate (key (car p
)))
1002 (return (or (and from-end
1003 (find-if predicate
(cdr p
) :end
(- end i
1) :key key
:from-end t
))
1005 (t (do ((p (nthcdr start sequence
) (cdr p
)))
1007 (when (predicate (key (car p
)))
1008 (return (or (and from-end
1009 (find-if predicate
(cdr p
) :key key
:from-end t
))
1010 (car p
)))))))))))))))
1012 (defun find-if-not (predicate sequence
&rest key-args
)
1013 (declare (dynamic-extent key-args
))
1014 (apply (complement predicate
) sequence key-args
))
1016 (defun count (item sequence
&key
(start 0) end
(test 'eql
) (key 'identity
) test-not from-end
)
1017 (declare (ignore test-not
))
1018 (let ((start (check-the index start
)))
1019 (with-funcallable (test)
1020 (with-funcallable (key)
1021 (sequence-dispatch sequence
1023 (let ((end (check-the index
(or end
(length sequence
)))))
1024 (with-subvector-accessor (sequence-ref sequence start end
)
1027 (do ((i start
(1+ i
))
1030 (declare (index i n
))
1031 (when (test item
(key (sequence-ref i
)))
1033 (t (do ((i (1- end
) (1- i
))
1036 (declare (index i n
))
1037 (when (test item
(key (sequence-ref i
)))
1042 (do ((p (nthcdr start sequence
) (cdr p
))
1046 (when (test item
(key (car p
)))
1048 (t (do ((p (nthcdr start sequence
) (cdr p
))
1051 ((or (endp p
) (>= i end
)) n
)
1052 (declare (index i n
))
1053 (when (test item
(key (car p
)))
1056 (defun count-if (predicate sequence
&key
(start 0) end
(key 'identity
) #+ignore from-end
)
1058 (2 (predicate sequence
)
1059 (with-funcallable (predicate)
1060 (sequence-dispatch sequence
1063 (declare (index count
))
1064 (dolist (x sequence
)
1069 (with-subvector-accessor (sequence-ref sequence
)
1071 (declare (index count
))
1072 (dotimes (i (length sequence
))
1073 (when (predicate (sequence-ref i
))
1076 (t (predicate sequence
&key
(start 0) end
(key 'identity
) #+ignore from-end
)
1077 (let ((start (check-the index start
)))
1078 (with-funcallable (predicate)
1079 (with-funcallable (key)
1080 (sequence-dispatch sequence
1084 (p (nthcdr start sequence
) (cdr p
)))
1087 (when (predicate (key (car p
)))
1089 (let ((end (check-the index end
)))
1092 (p (nthcdr start sequence
) (cdr p
)))
1093 ((or (endp p
) (>= i end
)) n
)
1094 (declare (index i n
))
1095 (when (predicate (key (car p
)))
1098 (error "vector count-if not implemented.")))))))))
1101 (macrolet ((every-some-body ()
1102 "This function body is shared between every and some."
1103 `(with-funcallable (predicate)
1105 ((null more-sequences
) ; 1 sequence case
1106 (sequence-dispatch first-sequence
1108 (do ((p first-sequence
(cdr p
)))
1109 ((null p
) (default-value))
1110 (test-return (predicate (car p
)))))
1112 (do* ((l (length first-sequence
))
1114 ((= l i
) (default-value))
1115 (declare (index i l
))
1116 (test-return (predicate (aref first-sequence i
)))))))
1117 ((null (cdr more-sequences
)) ; 2 sequences case
1118 (let ((second-sequence (first more-sequences
)))
1119 (sequence-double-dispatch (first-sequence second-sequence
)
1121 (do ((p0 first-sequence
(cdr p0
))
1122 (p1 second-sequence
(cdr p1
)))
1123 ((or (endp p0
) (endp p1
)) (default-value))
1124 (test-return (predicate (car p0
) (car p1
)))))
1126 (do ((end (min (length first-sequence
) (length second-sequence
)))
1128 ((>= i end
) (default-value))
1130 (test-return (predicate (aref first-sequence i
)
1131 (aref second-sequence i
)))))
1133 (do ((end (length second-sequence
))
1135 (p first-sequence
(cdr p
)))
1136 ((or (endp p
) (>= i end
)) (default-value))
1138 (test-return (predicate (car p
) (aref second-sequence i
)))))
1140 (do ((end (length first-sequence
))
1142 (p second-sequence
(cdr p
)))
1143 ((or (endp p
) (>= i end
)) (default-value))
1145 (test-return (predicate (aref first-sequence i
) (car p
))))))))
1147 (sequence-dispatch p
1151 (sequence-dispatch p
1153 (vector (>= i
(length p
)))))
1155 (sequence-dispatch p
1157 (vector (aref p i
)))))
1158 (do* ((i 0 (1+ i
)) ; 3 or more sequences, conses at 4 or more.
1159 (p0 first-sequence
(next p0
))
1160 (p1 (car more-sequences
) (next p1
))
1161 (p2 (cadr more-sequences
) (next p2
))
1162 (p3+ (cddr more-sequences
) (map-into p3
+ #'next p3
+)) ;a list of pointers
1163 (arg3+ (make-list (length p3
+))))
1172 (do ((x arg3
+ (cdr x
))
1175 (setf (car x
) (seqelt (car y
) i
)))
1176 (test-return (apply predicate
(seqelt p0 i
) (seqelt p1 i
)
1177 (seqelt p2 i
) arg3
+)))))))))
1178 (defun some (predicate first-sequence
&rest more-sequences
)
1179 (declare (dynamic-extent more-sequences
))
1180 (macrolet ((test-return (form)
1181 `(let ((x ,form
)) (when x
(return x
))))
1182 (default-value () nil
))
1184 (defun every (predicate first-sequence
&rest more-sequences
)
1185 (declare (dynamic-extent more-sequences
))
1186 (macrolet ((test-return (form)
1187 `(unless ,form
(return nil
)))
1188 (default-value () t
))
1189 (every-some-body))))
1191 (defun notany (predicate first-sequence
&rest more-sequences
)
1192 (declare (dynamic-extent more-sequences
))
1193 (not (apply 'some predicate first-sequence more-sequences
)))
1195 (defun list-remove (item list test key end count
)
1196 "Implements remove for lists. Assumes (not from-end)."
1202 (t (with-funcallable (test)
1203 (with-funcallable (key)
1204 (if (test item
(key (car list
)))
1205 (list-remove item
(cdr list
) test key
1207 (when count
(1- count
)))
1210 (p1 (cdr list
) (cdr p1
)))
1211 ((or (endp p1
) (and end
(>= i end
))) list
)
1213 (when (test item
(key (car p1
)))
1215 ;; reiterate from <list> to <p1>, consing up a copy, with
1216 ;; the copy's tail being the recursive call to list-remove.
1217 (do* ((new-list (cons (car list
) nil
))
1218 (x (cdr list
) (cdr x
))
1221 (setf (cdr new-x
) (list-remove item
(cdr p1
) test key
1222 (when end
(- end i
1))
1223 (when count
(1- count
))))
1227 (cons (car x
) nil
)))))))))))))
1229 (defun list-remove-simple (item list
)
1230 "The same as list-remove, without count, end, or key, with test=eql."
1234 ((eql item
(car list
))
1235 (list-remove-simple item
(cdr list
)))
1236 (t (do ((i 1 (1+ i
))
1238 (p1 (cdr list
) (cdr p1
)))
1241 (when (eql item
(car p1
))
1243 ;; reiterate from <list> to <p1>, consing up a copy, with
1244 ;; the copy's tail being the recursive call to list-remove.
1245 (do* ((new-list (cons (car list
) nil
))
1246 (x (cdr list
) (cdr x
))
1249 (setf (cdr new-x
) (list-remove-simple item
(cdr p1
)))
1253 (cons (car x
) nil
))))))))))
1255 (defun remove (item sequence
&key
(test 'eql
) (start 0) end count
(key 'identity
) test-not from-end
)
1257 (setf test
(complement test-not
)))
1258 (sequence-dispatch sequence
1260 (setf sequence
(nthcdr start sequence
))
1261 (when end
(decf end start
))
1266 (if (and (eq test
'eql
)
1270 (list-remove-simple item sequence
)
1271 (list-remove item sequence test key end count
)))
1272 (t (error "from-end not implemented."))))
1274 (error "vector remove not implemented."))))
1276 (defun list-remove-if (test list key end count
)
1277 "Implements remove-if for lists. Assumes (not from-end)."
1283 (t (with-funcallable (test)
1284 (with-funcallable (key)
1285 (and (do () ((or (endp list
)
1286 (and end
(<= end
0))
1287 (not (test (key (car list
))))
1288 (and count
(<= (decf count
) 0)))
1290 (when end
(decf end
))
1291 (setf list
(cdr list
)))
1294 (p1 (cdr list
) (cdr p1
)))
1295 ((or (endp p1
) (and end
(>= i end
))) list
)
1297 (when (test (key (car p1
)))
1299 ;; reiterate from <list> to <p1>, consing up a copy, with
1300 ;; the copy's tail being the recursive call to list-remove.
1301 (do* ((new-list (cons (car list
) nil
))
1302 (x (cdr list
) (cdr x
))
1305 (setf (cdr new-x
) (list-remove-if test
(cdr p1
) key
1306 (when end
(- end i
1))
1307 (when count
(1- count
))))
1311 (cons (car x
) nil
)))))))))))))
1313 (defun remove-if (test sequence
&key from-end
(start 0) end count
(key 'identity
))
1314 (sequence-dispatch sequence
1316 (setf sequence
(nthcdr start sequence
))
1317 (when end
(decf end start
))
1322 (list-remove-if test sequence key end count
))
1323 (t (error "from-end not implemented."))))
1325 (error "vector remove not implemented."))))
1327 (defun remove-if-not (test sequence
&rest args
)
1328 (declare (dynamic-extent args
))
1329 (apply 'remove-if
(complement test
) sequence args
))
1331 (defun list-delete (item list test key start end count
)
1332 "Implements delete-if for lists. Assumes (not from-end)."
1340 (t (with-funcallable (test)
1341 (with-funcallable (key)
1342 (let ((i 0) ; for end checking
1343 (c 0)) ; for count checking
1344 (declare (index i c
))
1347 ;; delete from head..
1349 ((not (test item
(key (car list
)))))
1350 (when (or (endp (setf list
(cdr list
)))
1352 (eq (incf c
) count
))
1353 (return-from list-delete list
)))
1355 (t (incf i
(1- start
))))
1356 ;; now delete "inside" list
1357 (do* ((p (nthcdr (1- start
) list
))
1363 ((test item
(key (car q
)))
1366 (when (eq (incf c
) count
)
1372 (defun list-delete-if (test list key start end count
)
1373 "Implements delete-if for lists. Assumes (not from-end)."
1381 (t (with-funcallable (test)
1382 (with-funcallable (key)
1383 (let ((i 0) ; for end checking
1384 (c 0)) ; for count checking
1385 (declare (index i c
))
1388 ;; delete from head..
1390 ((not (test (key (car list
)))))
1391 (when (or (endp (setf list
(cdr list
)))
1393 (eq (incf c
) count
))
1394 (return-from list-delete-if list
)))
1396 (t (incf i
(1- start
))))
1397 ;; now delete "inside" list
1398 (do* ((p (nthcdr (1- start
) list
))
1404 ((test (key (car q
)))
1407 (when (eq (incf c
) count
)
1412 (defun delete (item sequence
&key
(test 'eql
) from-end
(start 0) end count
(key 'identity
))
1413 (sequence-dispatch sequence
1416 (error "from-end not implemented."))
1417 (list-delete item sequence test key start end count
))
1419 (error "vector delete not implemented."))))
1421 (defun delete-if (test sequence
&key from-end
(start 0) end count
(key 'identity
))
1422 (sequence-dispatch sequence
1425 (error "from-end not implemented."))
1426 (list-delete-if test sequence key start end count
))
1428 (error "vector delete-if not implemented."))))
1430 (defun delete-if-not (test sequence
&rest key-args
)
1431 (declare (dynamic-extent key-args
))
1432 (apply 'delete-if
(complement test
) sequence key-args
))
1434 (defun remove-duplicates (sequence &key
(test 'eql
) (key 'identity
) (start 0) end test-not from-end
)
1436 (setf test
(complement test-not
)))
1437 (sequence-dispatch sequence
1439 (let ((list (nthcdr start sequence
)))
1443 ((and (not end
) (not from-end
))
1445 ((endp list
) (nreverse r
))
1446 (let ((x (pop list
)))
1447 (unless (member x list
:key key
:test test
)
1449 (t (error "remove-duplicates not implemented.")))))
1451 (error "vector remove-duplicates not implemented."))))
1453 (defun delete-duplicates (sequence &key from-end
(test 'eql
) (key 'identity
) test-not
(start 0) end
)
1454 (let ((test (if test-not
1455 (complement test-not
)
1457 (sequence-dispatch sequence
1461 (error "from-end not implemented."))
1463 (when (not (endp sequence
))
1467 ((not (find (car sequence
) (cdr sequence
) :test test
:key key
)))
1468 (setf sequence
(cdr sequence
))))
1469 (do* ((p (nthcdr start sequence
))
1470 (q (cdr p
) (cdr p
)))
1472 (if (find (car q
) (cdr q
) :test test
:key key
)
1473 (setf (cdr p
) (cdr q
))
1474 (setf p
(cdr p
))))))
1475 (t (error "delete-duplicates end parameter not implemented."))))
1478 ;;; (setf end (length sequence)))
1479 ;;; (do ((i start (1+ i))
1483 ;;; ((= 0 c) sequence)
1485 (error "vector delete-duplicates not implemented.")))))
1488 (defun search (sequence-1 sequence-2
&key
(test 'eql
) (key 'identity
)
1489 (start1 0) end1
(start2 0) end2 test-not from-end
)
1490 (let ((test (if test-not
1491 (complement test-not
)
1493 (declare (dynamic-extent test
))
1494 (let ((start1 (check-the index start1
))
1495 (start2 (check-the index start2
)))
1496 (sequence-dispatch sequence-2
1498 (let ((end1 (check-the index
(or end1
(length sequence-1
))))
1499 (end2 (check-the index
(or end2
(length sequence-2
)))))
1500 (do ((stop (- end2
(- end1 start1
1)))
1504 (let ((mismatch-position (mismatch sequence-1 sequence-2
1505 :start1 start1
:end1 end1
1506 :start2 i
:end2 end2
1507 :key key
:test test
)))
1508 (when (or (not mismatch-position
)
1509 (= mismatch-position end1
))
1510 (return (or (and from-end
1511 (search sequence-1 sequence-2
1512 :from-end t
:test test
:key key
1513 :start1 start1
:end1 end1
1514 :start2
(1+ i
) :end2 end2
))
1517 (let ((end1 (check-the index
(or end1
(length sequence-1
)))))
1518 (do ((stop (and end2
(- end2 start2
(- end1 start1
1))))
1519 (p (nthcdr start2 sequence-2
) (cdr p
))
1521 ((or (endp p
) (and stop
(>= i stop
))) nil
)
1523 (let ((mismatch-position (mismatch sequence-1 p
1524 :start1 start1
:end1 end1
1525 :key key
:test test
)))
1526 (when (or (not mismatch-position
)
1527 (= mismatch-position end1
))
1530 (search sequence-1 p
1531 :start2
1 :end2
(and end2
(- end2 i start2
))
1532 :from-end t
:test test
:key key
1533 :start1 start1
:end1 end1
))
1536 (defun insertion-sort (vector predicate key start end
)
1537 "Insertion-sort is used for stable-sort, and as a finalizer for
1538 quick-sort with cut-off greater than 1."
1539 (let ((start (check-the index start
))
1540 (end (check-the index end
)))
1541 (with-funcallable (predicate)
1542 (with-subvector-accessor (vector-ref vector start end
)
1544 (do ((i (1+ start
) (1+ i
)))
1547 ;; insert vector[i] into [start...i-1]
1548 (let ((v (vector-ref i
))
1550 (when (predicate v
(vector-ref j
))
1551 (setf (vector-ref i
) (vector-ref j
))
1552 (do* ((j+1 j
(1- j
+1))
1555 (not (predicate v
(vector-ref j
))))
1556 (setf (vector-ref j
+1) v
))
1557 (declare (index j j
+1))
1558 (setf (vector-ref j
+1) (vector-ref j
))))))
1559 (with-funcallable (key)
1560 (do ((i (1+ start
) (1+ i
))) ; the same, only with a key-function..
1563 ;; insert vector[i] into [start...i-1]
1564 (do* ((v (vector-ref i
))
1569 (not (predicate vk
(key (vector-ref j
)))))
1570 (setf (vector-ref j
+1) v
))
1571 (declare (index j j
+1))
1572 (setf (vector-ref j
+1) (vector-ref j
)))))))))
1575 (defun quick-sort (vector predicate key start end cut-off
)
1576 (let ((start (check-the index start
))
1577 (end (check-the index end
)))
1578 (macrolet ((do-while (p &body body
)
1579 `(do () ((not ,p
)) ,@body
)))
1580 (when (> (- end start
) cut-off
)
1581 (with-subvector-accessor (vector-ref vector start end
)
1582 (with-funcallable (predicate)
1583 (with-funcallable (key)
1584 (prog* ((pivot (vector-ref start
)) ; should do median-of-three here..
1585 (keyed-pivot (key pivot
))
1588 left-item right-item
)
1589 (declare (index left right
))
1590 ;; do median-of-three..
1591 (let ((p1 (vector-ref start
))
1592 (p2 (vector-ref (+ start cut-off -
1)))
1593 (p3 (vector-ref (1- end
))))
1594 (let ((kp1 (key p1
))
1599 (if (predicate p2 p3
)
1600 (setf pivot p2 keyed-pivot kp2
)
1601 (if (predicate p1 p3
)
1602 (setf pivot p3 keyed-pivot kp3
)
1603 (setf pivot p1 keyed-pivot kp1
))))
1605 (if (predicate p1 p3
)
1606 (setf pivot p1 keyed-pivot kp1
)
1607 (setf pivot p3 keyed-pivot kp3
)))
1608 (t (setf pivot p2 keyed-pivot kp2
)))))
1610 (do-while (not (predicate keyed-pivot
(key (setf left-item
(vector-ref left
)))))
1613 (setf right-item
(vector-ref right
))
1614 (go partitioning-complete
)))
1615 (do-while (predicate keyed-pivot
(key (setf right-item
(vector-ref right
))))
1617 (when (< left right
)
1618 (setf (vector-ref left
) right-item
1619 (vector-ref right
) left-item
)
1622 (go partitioning-loop
))
1623 partitioning-complete
1624 (setf (vector-ref start
) right-item
; (aref vector right)
1625 (vector-ref right
) pivot
)
1626 (when (and (> cut-off
(- right start
))
1627 (> cut-off
(- end right
)))
1628 (quick-sort vector predicate key start right cut-off
)
1629 (quick-sort vector predicate key
(1+ right
) end cut-off
)))))))))
1632 (defun sort (sequence predicate
&key
(key 'identity
))
1633 (sequence-dispatch sequence
1635 (sort-list sequence predicate key
))
1637 (quick-sort sequence predicate key
0 (length sequence
) 9)
1638 (insertion-sort sequence predicate key
0 (length sequence
)))))
1640 (defun stable-sort (sequence predicate
&key key
)
1641 (sequence-dispatch sequence
1643 (error "Stable-sort not implemented for lists."))
1645 (insertion-sort sequence predicate key
0 (length sequence
)))))
1648 (defun merge (result-type sequence-1 sequence-2 predicate
&key
(key 'identity
))
1651 (sequence-double-dispatch (sequence-1 sequence-2
)
1653 (merge-list-list sequence-1 sequence-2 predicate key
))))))
1655 (defun merge-list-list (list1 list2 predicate key
)
1661 (t (with-funcallable (predicate)
1662 (with-funcallable (key)
1663 (macrolet ((xpop (var)
1664 `(let ((x ,var
)) (setf ,var
(cdr x
)) x
)))
1665 (do* ((result (if (predicate (key (car list1
)) (key (car list2
)))
1672 ((null list1
) (xpop list2
))
1673 ((null list2
) (xpop list1
))
1674 ((predicate (key (car list1
)) (key (car list2
)))
1676 (t (xpop list2
))))))
1680 ;;; Most of list-sorting snipped from cmucl.
1682 ;;; MERGE-LISTS* originally written by Jim Large.
1683 ;;; modified to return a pointer to the end of the result
1684 ;;; and to not cons header each time its called.
1685 ;;; It destructively merges list-1 with list-2. In the resulting
1686 ;;; list, elements of list-2 are guaranteed to come after equal elements
1688 (defun merge-lists* (list-1 list-2 predicate key merge-lists-header
)
1689 (with-funcallable (predicate)
1690 (with-funcallable (key)
1691 (do* ((result merge-lists-header
)
1692 (P result
)) ; P points to last cell of result
1693 ((or (null list-1
) (null list-2
)) ; done when either list used up
1694 (if (null list-1
) ; in which case, append the
1695 (rplacd p list-2
) ; other list
1698 (lead (cdr p
) (cdr lead
)))
1700 (values (prog1 (cdr result
) ; return the result sans header
1701 (rplacd result nil
)) ; (free memory, be careful)
1702 drag
)))) ; and return pointer to last element
1703 (cond ((predicate (key (car list-2
)) (key (car list-1
)))
1704 (rplacd p list-2
) ; append the lesser list to last cell of
1705 (setq p
(cdr p
)) ; result. Note: test must bo done for
1706 (pop list-2
)) ; list-2 < list-1 so merge will be
1707 (t (rplacd p list-1
) ; stable for list-1
1712 ;;; SORT-LIST uses a bottom up merge sort. First a pass is made over
1713 ;;; the list grabbing one element at a time and merging it with the next one
1714 ;;; form pairs of sorted elements. Then n is doubled, and elements are taken
1715 ;;; in runs of two, merging one run with the next to form quadruples of sorted
1716 ;;; elements. This continues until n is large enough that the inner loop only
1717 ;;; runs for one iteration; that is, there are only two runs that can be merged,
1718 ;;; the first run starting at the beginning of the list, and the second being
1719 ;;; the remaining elements.
1721 (defun sort-list (list pred key
)
1722 (let ((head (cons :header list
)) ; head holds on to everything
1723 (n 1) ; bottom-up size of lists to be merged
1724 unsorted
; unsorted is the remaining list to be
1725 ; broken into n size lists and merged
1726 list-1
; list-1 is one length n list to be merged
1727 last
; last points to the last visited cell
1728 (merge-lists-header (list :header
)))
1731 ;; start collecting runs of n at the first element
1732 (setf unsorted
(cdr head
))
1733 ;; tack on the first merge of two n-runs to the head holder
1737 (setf list-1 unsorted
)
1738 (let ((temp (nthcdr n-1 list-1
))
1741 ;; there are enough elements for a second run
1742 (setf list-2
(cdr temp
))
1743 (setf (cdr temp
) nil
)
1744 (setf temp
(nthcdr n-1 list-2
))
1746 (setf unsorted
(cdr temp
))
1747 (setf (cdr temp
) nil
))
1748 ;; the second run goes off the end of the list
1749 (t (setf unsorted nil
)))
1750 (multiple-value-bind (merged-head merged-last
)
1751 (merge-lists* list-1 list-2 pred key
1753 (setf (cdr last
) merged-head
)
1754 (setf last merged-last
))
1755 (if (null unsorted
) (return)))
1756 ;; if there is only one run, then tack it on to the end
1757 (t (setf (cdr last
) list-1
)
1760 ;; If the inner loop only executed once, then there were only enough
1761 ;; elements for two runs given n, so all the elements have been merged
1762 ;; into one list. This may waste one outer iteration to realize.
1763 (if (eq list-1
(cdr head
))
1764 (return list-1
))))))
1766 (defun make-sequence (result-type size
&key
(initial-element nil initial-element-p
))
1770 (if (not initial-element-p
)
1772 (make-string size
:initial-element initial-element
)))
1774 (make-array size
:initial-element initial-element
))
1776 (make-list size
:initial-element initial-element
))))
1778 (defun concatenate (result-type &rest sequences
)
1779 "=> result-sequence"
1780 (declare (dynamic-extent sequences
))
1783 (make-sequence result-type
0))
1784 ((and (null (rest sequences
))
1785 (typep (first sequences
) result-type
))
1786 (copy-seq (first sequences
)))
1787 ((= 0 (length (first sequences
)))
1788 (apply #'concatenate result-type
(cdr sequences
)))
1789 ((member result-type
'(vector string
))
1790 (let* ((r (make-sequence result-type
1792 (dolist (s sequences length
)
1793 (incf length
(length s
))))))
1796 (dolist (s sequences
)
1797 (replace r s
:start1 i
)
1798 (incf i
(length s
)))
1800 (t (error "Can't concatenate ~S yet: ~:S" result-type sequences
))))
1803 (defun substitute (newitem olditem sequence
1804 &key
(test 'eql
) test-not
(start 0) end count
(key 'identity
) from-end
)
1805 "=> result-sequence"
1807 (setf test
(complement test-not
)))
1808 (with-funcallable (test (if test-not
(complement test-not
) test
))
1809 (substitute-if newitem
(lambda (x) (test olditem x
)) sequence
1810 :start start
:end end
1811 :count count
:key key
1812 :from-end from-end
)))
1814 (defun nsubstitute (newitem olditem sequence
1815 &key
(test 'eql
) test-not
(start 0) end count
(key 'identity
) from-end
)
1816 "=> result-sequence"
1818 (setf test
(complement test-not
)))
1819 (with-funcallable (test (if test-not
(complement test-not
) test
))
1820 (nsubstitute-if newitem
(lambda (x) (test olditem x
)) sequence
1821 :start start
:end end
1822 :count count
:key key
1823 :from-end from-end
)))
1825 (defun substitute-if (newitem predicate sequence
&rest args
1826 &key
(start 0) end count
(key 'identity
) from-end
)
1827 "=> result-sequence"
1828 (declare (dynamic-extent args
))
1829 (with-funcallable (predicate)
1830 (with-funcallable (key)
1831 (sequence-dispatch sequence
1833 (apply 'nsubstitute-if newitem predicate
(copy-seq sequence
) args
))
1836 (apply 'nsubstitute-if newitem predicate
(copy-list sequence
) args
)
1837 (if (or (null sequence
)
1838 (and end
(<= end start
)))
1840 (multiple-value-bind (new-list new-tail
)
1842 (let ((new-list (list #0=(let ((x (pop sequence
)))
1843 (if (predicate (key x
))
1846 (values new-list new-list
))
1847 (do* ((new-list (list (pop sequence
)))
1848 (new-tail new-list
(cdr new-tail
))
1850 ((or (endp sequence
) (>= i start
))
1851 (values new-list new-tail
))
1852 (setf (cdr new-tail
) (list (pop sequence
)))))
1854 ((and (not end
) (not count
))
1856 ((endp sequence
) new-list
)
1858 (setf (cdr new-tail
) (list #0#)))))
1859 ((and end
(not count
))
1860 (do ((i (- end start
1) (1- i
)))
1861 ((or (endp sequence
) (<= i
0))
1862 (setf (cdr new-tail
) (copy-list sequence
))
1865 (setf (cdr new-tail
) (list #0#)))))
1866 ((and (not end
) count
)
1868 ((or (endp sequence
) (>= c count
))
1869 (setf (cdr new-tail
) (copy-list sequence
))
1872 (setf (cdr new-tail
) #1=(list (let ((x (pop sequence
)))
1873 (if (predicate (key x
))
1874 (progn (incf c
) newitem
)
1877 (do ((i (- end start
1) (1- i
))
1879 ((or (endp sequence
) (<= i
0) (>= c count
))
1880 (setf (cdr new-tail
)
1881 (copy-list sequence
))
1884 (setf (cdr new-tail
) #1#))))
1885 ((error 'program-error
)))))))))))
1887 (defun nsubstitute-if (newitem predicate sequence
&key
(start 0) end count
(key 'identity
) from-end
)
1891 (with-funcallable (predicate)
1892 (with-funcallable (key)
1893 (sequence-dispatch sequence
1895 (let ((end (or end
(length sequence
))))
1896 (with-subvector-accessor (ref sequence start end
)
1898 ((and (not count
) (not from-end
))
1899 (do ((i start
(1+ i
)))
1900 ((>= i end
) sequence
)
1902 (when (predicate (key (ref i
)))
1903 (setf (ref i
) newitem
))))
1904 ((and count
(not from-end
))
1907 ((>= i end
) sequence
)
1908 (declare (index i c
))
1909 (when (predicate (key (ref i
)))
1910 (setf (ref i
) newitem
)
1911 (when (>= (incf c
) count
)
1912 (return sequence
)))))
1913 ((and (not count
) from-end
)
1914 (do ((i (1- end
) (1- i
)))
1915 ((< i start
) sequence
)
1917 (when (predicate (key (ref i
)))
1918 (setf (ref i
) newitem
))))
1919 ((and count from-end
)
1921 (i (1- end
) (1- i
)))
1922 ((< i start
) sequence
)
1923 (declare (index c i
))
1924 (when (predicate (key (ref i
)))
1925 (setf (ref i
) newitem
)
1926 (when (>= (incf c
) count
)
1927 (return sequence
)))))
1928 ((error 'program-error
))))))
1930 (let ((p (nthcdr start sequence
)))
1933 (nreverse (nsubstitute-if newitem predicate
(nreverse sequence
)
1934 :start
(if (not end
) 0 (- (length sequence
) end
))
1935 :end
(if (plusp start
) nil
(- (length sequence
) start
))
1936 :count count
:key key
)))
1937 #+ignore
((and from-end count
)
1938 (let* ((end (and end
(- end start
)))
1939 (existing-count (count-if predicate p
:key key
:end end
)))
1941 ((>= i existing-count
)
1942 (nsubstitute-if newitem predicate p
:end end
:key key
)
1945 (when (predicate (key (car p
)))
1948 ((and (not end
) (not count
))
1951 (when (predicate (key (car p
)))
1952 (setf (car p
) newitem
))))
1953 ((and end
(not count
))
1954 (do ((i start
(1+ i
))
1956 ((or (endp p
) (>= i end
)) sequence
)
1958 (when (predicate (key (car p
)))
1959 (setf (car p
) newitem
))))
1960 ((and (not end
) count
)
1965 (when (predicate (key (car p
)))
1966 (setf (car p
) newitem
)
1967 (when (>= (incf c
) count
)
1968 (return sequence
)))))
1973 ((or (endp p
) (>= i end
)) sequence
)
1974 (declare (index c i
))
1975 (when (predicate (key (car p
)))
1976 (setf (car p
) newitem
)
1977 (when (>= (incf c
) count
)
1978 (return sequence
)))))
1979 ((error 'program-error
))))))))))
1981 (defun nsubstitute-if-not (newitem predicate sequence
&rest keyargs
)
1982 (declare (dynamic-extent keyargs
))
1983 (apply #'nsubstitute-if newitem
(complement predicate
) sequence keyargs
))