X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Flist.lisp;h=99e6e7adb84361400b55e91fbefe273646180694;hb=9afa2670555d2e6db5615c62d523259fdcb932ee;hp=cb75bdc99f0a1e114957f26de9f7509d62e54a03;hpb=3930890ddbf4e1fbdcc400879ca8245b5cd6c564;p=jscl.git diff --git a/src/list.lisp b/src/list.lisp index cb75bdc..99e6e7a 100644 --- a/src/list.lisp +++ b/src/list.lisp @@ -37,11 +37,17 @@ (defun cdr (x) (cdr x)) -(defun first (x) (car x)) -(defun second (x) (cadr x)) -(defun third (x) (caddr x)) -(defun fourth (x) (cadddr x)) -(defun rest (x) (cdr x)) +(defun first (x) (car x)) +(defun second (x) (cadr x)) +(defun third (x) (caddr x)) +(defun fourth (x) (cadddr x)) +(defun fifth (x) (car (cddddr x))) +(defun sixth (x) (cadr (cddddr x))) +(defun seventh (x) (caddr (cddddr x))) +(defun eighth (x) (cadddr (cddddr x))) +(defun ninth (x) (car (cddddr (cddddr x)))) +(defun tenth (x) (cadr (cddddr (cddddr x)))) +(defun rest (x) (cdr x)) (defun list (&rest args) args) @@ -66,17 +72,16 @@ (defun cadr (x) (car (cdr x))) (defun cdar (x) (cdr (car x))) (defun cddr (x) (cdr (cdr x))) -(defun cadar (x) (car (cdr (car x)))) -(defun caddr (x) (car (cdr (cdr x)))) -(defun cdddr (x) (cdr (cdr (cdr x)))) -(defun cadddr (x) (car (cdr (cdr (cdr x))))) - -(defun cadar (x) (car (cdar x))) -(defun caaar (x) (car (caar x))) -(defun caadr (x) (car (cadr x))) -(defun cdaar (x) (cdr (caar x))) -(defun cdadr (x) (cdr (cadr x))) -(defun cddar (x) (cdr (cdar x))) + +(defun caaar (x) (car (caar x))) +(defun caadr (x) (car (cadr x))) +(defun cadar (x) (car (cdar x))) +(defun caddr (x) (car (cddr x))) +(defun cdaar (x) (cdr (caar x))) +(defun cdadr (x) (cdr (cadr x))) +(defun cddar (x) (cdr (cdar x))) +(defun cdddr (x) (cdr (cddr x))) + (defun caaaar (x) (car (caaar x))) (defun caaadr (x) (car (caadr x))) (defun caadar (x) (car (cadar x))) @@ -84,6 +89,7 @@ (defun cadaar (x) (car (cdaar x))) (defun cadadr (x) (car (cdadr x))) (defun caddar (x) (car (cddar x))) +(defun cadddr (x) (car (cdddr x))) (defun cdaaar (x) (cdr (caaar x))) (defun cdaadr (x) (cdr (caadr x))) (defun cdadar (x) (cdr (cadar x))) @@ -103,6 +109,19 @@ (copy-tree (cdr tree))) tree)) +(defun tree-equal (tree1 tree2 &key (test #'eql)) + (if (atom tree1) + (and (atom tree2) (funcall test tree1 tree2)) + (and (consp tree2) + (tree-equal (car tree1) (car tree2) :test test) + (tree-equal (cdr tree1) (cdr tree2) :test test)))) + +(defun tailp (object list) + (do ((tail list (cdr tail))) + ((atom tail) (eq object tail)) + (when (eql tail object) + (return-from tailp t)))) + (defun subst (new old tree &key (key #'identity) (test #'eql)) (cond ((funcall test (funcall key tree) (funcall key old)) @@ -142,6 +161,13 @@ (rplaca tail (cdar tail))) (collect (apply func elems)))))))) +(defun mapc (func &rest lists) + (do* ((elems (map1 #'car lists) (map1 #'car lists-rest)) + (lists-rest (map1 #'cdr lists) (map1 #'cdr lists-rest))) + ((dolist (x elems) (when (null x) (return t))) + (car lists)) + (apply func elems))) + (defun last (x) (while (consp (cdr x)) (setq x (cdr x))) @@ -151,9 +177,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)))) @@ -161,10 +187,33 @@ (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) + (cons (cons key datum) alist)) + +(defun pairlis (keys data &optional (alist ())) + (while keys + (setq alist (acons (car keys) (car data) alist)) + (setq keys (cdr keys)) + (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) @@ -221,3 +270,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))