X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Flist.lisp;h=7a4ca6d909dfd7c9ff98d5fac5b6e2dfeaf4b2db;hb=6d86a4367eb3ea3e7a33284c9f86cf06c01105be;hp=b353700fa6950e7cd97739408fd9ccdbbbad16c0;hpb=37b1b658da3d73aa304df83cc3e8bf8aa6548a25;p=jscl.git diff --git a/src/list.lisp b/src/list.lisp index b353700..7a4ca6d 100644 --- a/src/list.lisp +++ b/src/list.lisp @@ -170,9 +170,9 @@ (and (consp (cdr x)) (cons (car x) (butlast (cdr x))))) -(defun member (x list) +(defun member (x list &key (key #'identity) (test #'eql)) (while list - (when (eql x (car list)) + (when (funcall test x (funcall key (car list))) (return list)) (setq list (cdr list)))) @@ -180,8 +180,15 @@ (defun assoc (x alist &key (test #'eql)) (while alist (if (funcall test x (caar alist)) - (return) - (setq alist (cdr alist)))) + (return) + (setq alist (cdr alist)))) + (car alist)) + +(defun rassoc (x alist &key (test #'eql)) + (while alist + (if (funcall test x (cdar alist)) + (return) + (setq alist (cdr alist)))) (car alist)) (defun acons (key datum alist) @@ -194,6 +201,13 @@ (setq data (cdr data))) alist) +(defun copy-alist (alist) + (let ((new-alist ())) + (while alist + (push (cons (caar alist) (cdar alist)) new-alist) + (setq alist (cdr alist))) + (reverse new-alist))) + (define-setf-expander car (x) (let ((cons (gensym)) @@ -249,3 +263,16 @@ (3rd y 2nd)) ;3rd follows 2nd down the list. ((atom 2nd) 3rd) (rplacd 2nd 3rd))) + + +(defun adjoin (item list &key (test #'eql) (key #'identity)) + (if (member item list :key key :test test) + list + (cons item list))) + +(defun intersection (list1 list2 &key (test #'eql) (key #'identity)) + (let ((new-list ())) + (dolist (x list1) + (when (member x list2 :test test :key key) + (push x new-list))) + new-list))