[movitz-cvs] CVS movitz/losp/muerte
ffjeld
ffjeld at common-lisp.net
Fri Mar 24 22:22:50 UTC 2006
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory clnet:/tmp/cvs-serv23085
Modified Files:
sequences.lisp
Log Message:
Improved substitute-if.
--- /project/movitz/cvsroot/movitz/losp/muerte/sequences.lisp 2006/03/21 21:23:27 1.29
+++ /project/movitz/cvsroot/movitz/losp/muerte/sequences.lisp 2006/03/24 22:22:50 1.30
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Created at: Tue Sep 11 14:19:23 2001
;;;;
-;;;; $Id: sequences.lisp,v 1.29 2006/03/21 21:23:27 ffjeld Exp $
+;;;; $Id: sequences.lisp,v 1.30 2006/03/24 22:22:50 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -1775,45 +1775,55 @@
(nreverse (nsubstitute-if newitem predicate (reverse sequence)
:start start :end end
:count count :key key))
- (let ((sequence (nthcdr start sequence)))
- (if (or (null sequence)
- (and end (<= end start)))
- nil
- (let ((new-list (list #0=(let ((x (pop sequence)))
- (if (predicate (key x))
- newitem
- x)))))
- (cond
- ((and (not end) (not count))
- (do ((new-tail new-list (cdr new-tail)))
- ((endp sequence) new-list)
- (setf (cdr new-tail) (list #0#))))
- ((and end (not count))
- (do ((i (- end start) (1- i))
- (new-tail new-list (cdr new-tail)))
- ((or (endp sequence) (<= i 0)) new-list)
- (setf (cdr new-tail) (list #0#))))
- ((and (not end) count)
- (do ((c 0)
- (new-tail new-list (cdr new-tail)))
- ((or (endp sequence) (>= c count))
- (setf (cdr new-tail)
- (copy-list sequence))
- new-list)
+ (if (or (null sequence)
+ (and end (<= end start)))
+ nil
+ (multiple-value-bind (new-list new-tail)
+ (if (= 0 start)
+ (let ((new-list (list #0=(let ((x (pop sequence)))
+ (if (predicate (key x))
+ newitem
+ x)))))
+ (values new-list new-list))
+ (do* ((new-list (list (pop sequence)))
+ (new-tail new-list (cdr new-tail))
+ (i 1 (1+ i)))
+ ((or (endp sequence) (>= i start))
+ (values new-list new-tail))
+ (setf (cdr new-tail) (list (pop sequence)))))
+ (cond
+ ((and (not end) (not count))
+ (do ()
+ ((endp sequence) new-list)
+ (setf new-tail
+ (setf (cdr new-tail) (list #0#)))))
+ ((and end (not count))
+ (do ((i (- end start 1) (1- i)))
+ ((or (endp sequence) (<= i 0))
+ (setf (cdr new-tail) (copy-list sequence))
+ new-list)
+ (setf new-tail
+ (setf (cdr new-tail) (list #0#)))))
+ ((and (not end) count)
+ (do ((c 0))
+ ((or (endp sequence) (>= c count))
+ (setf (cdr new-tail) (copy-list sequence))
+ new-list)
+ (setf new-tail
(setf (cdr new-tail) #1=(list (let ((x (pop sequence)))
(if (predicate (key x))
(progn (incf c) newitem)
- x))))))
- ((and end count)
- (do ((i (- end start) (1- i))
- (c 0)
- (new-tail new-list (cdr new-tail)))
- ((or (endp sequence) (<= i 0) (>= c count))
- (setf (cdr new-tail)
- (copy-list sequence))
- new-list)
- (setf (cdr new-tail) #1#)))
- ((error 'program-error))))))))))))
+ x)))))))
+ ((and end count)
+ (do ((i (- end start 1) (1- i))
+ (c 0))
+ ((or (endp sequence) (<= i 0) (>= c count))
+ (setf (cdr new-tail)
+ (copy-list sequence))
+ new-list)
+ (setf new-tail
+ (setf (cdr new-tail) #1#))))
+ ((error 'program-error)))))))))))
(defun nsubstitute-if (newitem predicate sequence &key (start 0) end count (key 'identity) from-end)
"=> sequence"
More information about the Movitz-cvs
mailing list