X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Flist.lisp;h=b974cd016d48e0cf4fd8a0125d65942404163607;hb=c38b7035616ea03b35706e2f180d78955b3b3b38;hp=36adc0e9f4b647a870e951f7d4598a346dcc0d70;hpb=d3e462f5e134d21a7f0ba60c50898d33a81ed643;p=jscl.git diff --git a/src/list.lisp b/src/list.lisp index 36adc0e..b974cd0 100644 --- a/src/list.lisp +++ b/src/list.lisp @@ -61,6 +61,13 @@ ((null (cddr x)) (rplacd x (cadr x)))) (cons arg others)))) +(defun list-length (list) + (let ((l 0)) + (while (not (null list)) + (incf l) + (setq list (cdr list))) + l)) + (defun nthcdr (n list) (while (and (plusp n) list) (setq n (1- n)) @@ -111,6 +118,24 @@ (defun cdddar (x) (cdr (cddar x))) (defun cddddr (x) (cdr (cdddr x))) +(defun append-two (list1 list2) + (if (null list1) + list2 + (cons (car list1) + (append (cdr list1) list2)))) + +(defun append (&rest lists) + (!reduce #'append-two lists nil)) + +(defun revappend (list1 list2) + (while list1 + (push (car list1) list2) + (setq list1 (cdr list1))) + list2) + +(defun reverse (list) + (revappend list '())) + (defun sublis (alist tree &key key (test #'eql testp) (test-not #'eql test-not-p)) (when (and testp test-not-p) (error "Both test and test-not are set")) @@ -166,18 +191,6 @@ (when (eql tail object) (return-from tailp t)))) -(defmacro pop (place) - (multiple-value-bind (dummies vals newval setter getter) - (get-setf-expansion place) - (let ((head (gensym))) - `(let* (,@(mapcar #'list dummies vals) - (,head ,getter) - (,(car newval) (cdr ,head)) - ,@(cdr newval)) - ,setter - (car ,head))))) - - (defun map1 (func list) (with-collect (while list