[movitz-cvs] CVS movitz/losp/muerte
ffjeld
ffjeld at common-lisp.net
Sun Apr 27 09:28:41 UTC 2008
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory clnet:/tmp/cvs-serv14216
Modified Files:
lists.lisp
Log Message:
Fix assoc-if, add rassoc-if, member-if, and mapcon.
--- /project/movitz/cvsroot/movitz/losp/muerte/lists.lisp 2008/04/19 12:44:02 1.27
+++ /project/movitz/cvsroot/movitz/losp/muerte/lists.lisp 2008/04/27 09:28:40 1.28
@@ -9,7 +9,7 @@
;;;; Created at: Tue Dec 5 18:40:11 2000
;;;; Distribution: See the accompanying file COPYING.
;;;;
-;;;; $Id: lists.lisp,v 1.27 2008/04/19 12:44:02 ffjeld Exp $
+;;;; $Id: lists.lisp,v 1.28 2008/04/27 09:28:40 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -82,6 +82,40 @@
(when (test item (key (car a)))
(return a))))))))
+(defun assoc-if (predicate alist &key (key 'identity))
+ "=> entry"
+ (numargs-case
+ (2 (predicate alist)
+ (with-funcallable (predicate)
+ (dolist (a alist)
+ (when a
+ (when (predicate (car a))
+ (return a))))))
+ (t (predicate alist &key (key 'identity))
+ (with-funcallable (key)
+ (with-funcallable (predicate)
+ (dolist (a alist)
+ (when a
+ (when (predicate (key (car a)))
+ (return a)))))))))
+
+(defun assoc-if-not (predicate alist &key (key 'identity))
+ "=> entry"
+ (numargs-case
+ (2 (predicate alist)
+ (with-funcallable (predicate)
+ (dolist (a alist)
+ (when a
+ (when (not (predicate (car a)))
+ (return a))))))
+ (t (predicate alist &key (key 'identity))
+ (with-funcallable (key)
+ (with-funcallable (predicate)
+ (dolist (a alist)
+ (when a
+ (when (not (predicate (key (car a))))
+ (return a)))))))))
+
(defun rassoc (item alist &key (test 'eql) (key 'identity))
(numargs-case
(2 (item alist)
@@ -95,6 +129,24 @@
(when (test item (key (cdr a)))
(return a))))))))
+(defun rassoc-if (predicate alist &key (key 'identity))
+ "=> entry"
+ (numargs-case
+ (2 (predicate alist)
+ (with-funcallable (predicate)
+ (dolist (a alist)
+ (when a
+ (when (predicate (cdr a))
+ (return a))))))
+ (t (predicate alist &key (key 'identity))
+ (with-funcallable (key)
+ (with-funcallable (predicate)
+ (dolist (a alist)
+ (when a
+ (when (predicate (key (cdr a)))
+ (return a)))))))))
+
+
(defun list-length (x)
(do ((n 0 (+ n 2)) ;Counter.
(fast x (cddr fast)) ;Fast pointer: leaps by 2.
@@ -128,6 +180,38 @@
(when (test (key item) (key (car p)))
(return p)))))))))
+(defun member-if (predicate list &key key)
+ (numargs-case
+ (2 (predicate list)
+ (with-funcallable (predicate)
+ (do ((p list (cdr p)))
+ ((endp p) nil)
+ (when (predicate (car p))
+ (return p)))))
+ (t (predicate list &key (key 'identity))
+ (with-funcallable (predicate)
+ (with-funcallable (key)
+ (do ((p list (cdr p)))
+ ((endp p) nil)
+ (when (predicate (key (car p)))
+ (return p))))))))
+
+(defun member-if-not (predicate list &key key)
+ (numargs-case
+ (2 (predicate list)
+ (with-funcallable (predicate)
+ (do ((p list (cdr p)))
+ ((endp p) nil)
+ (when (not (predicate (car p)))
+ (return p)))))
+ (t (predicate list &key (key 'identity))
+ (with-funcallable (predicate)
+ (with-funcallable (key)
+ (do ((p list (cdr p)))
+ ((endp p) nil)
+ (when (not (predicate (key (car p))))
+ (return p))))))))
+
(defun last (list &optional (n 1))
;; from the hyperspec..
(check-type n integer) ; (integer 0))
@@ -320,8 +404,6 @@
(setf more-lists
(map-into more-lists #'cdr more-lists))))))
-
-
(defun mapcan (function first-list &rest more-lists)
(numargs-case
(2 (function first-list)
@@ -362,6 +444,48 @@
(setf more-lists
(map-into more-lists #'cdr more-lists))))))
+(defun mapcon (function first-list &rest more-lists)
+ (numargs-case
+ (2 (function first-list)
+ (do ((result nil)
+ (tail nil)
+ (p first-list (cdr p)))
+ ((endp p) result)
+ (let ((m (funcall function p)))
+ (if tail
+ (setf (cdr tail) m)
+ (setf result m))
+ (setf tail (last m)))))
+ (3 (function first-list second-list)
+ (do ((result nil)
+ (tail nil)
+ (p first-list (cdr p))
+ (q second-list (cdr q)))
+ ((or (endp p)
+ (endp q))
+ result)
+ (let ((m (funcall function p q)))
+ (if tail
+ (setf (cdr tail) m)
+ (setf result m))
+ (setf tail (last m)))))
+ (t (function first-list &rest more-lists)
+ (declare (dynamic-extent more-lists))
+ (do ((result nil)
+ (tail nil))
+ ((or (endp first-list)
+ (some #'endp more-lists))
+ result)
+ (let ((m (apply function first-list more-lists)))
+ (if tail
+ (setf (cdr tail) m)
+ (setf result m))
+ (setf tail (last m)))
+ (setf first-list
+ (cdr first-list))
+ (setf more-lists
+ (map-into more-lists #'cdr more-lists))))))
+
(defun mapc (function first-list &rest more-lists)
(numargs-case
(2 (function first-list)
More information about the Movitz-cvs
mailing list