X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Flist.lisp;h=173dedf18d2917b96104a07cbc6136e37a273e0a;hb=643483ceecc115d48b10f095b31b5eca62e2228b;hp=af235dc33dede9fefbe8953d92ae47550ff731cb;hpb=7709a56a5467d8d78e1a2d86588be7dd60de3679;p=jscl.git diff --git a/src/list.lisp b/src/list.lisp index af235dc..173dedf 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) @@ -62,7 +68,6 @@ (defun nth (n list) (car (nthcdr n list))) -;;; The rest of the C[AD]*R functions; only a few were defined in boot.lisp (defun caar (x) (car (car x))) (defun cadr (x) (car (cdr x))) (defun cdar (x) (cdr (car x))) @@ -104,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))