X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=lists.lisp;h=3115dd5dbe1b99476baf576be214fe4353615686;hp=674a5d76b22d9977aff797b61e0d71d1b55d73bd;hb=526eef1b59e071cbb4ecd35f73a14c1a3f8e32b6;hpb=61100bfd2f0176c743db058160316a59441ce352 diff --git a/lists.lisp b/lists.lisp index 674a5d7..3115dd5 100644 --- a/lists.lisp +++ b/lists.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: lists.lisp,v 1.10 2003/08/12 06:37:53 kevin Exp $ +;;;; $Id$ ;;;; ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -42,13 +42,15 @@ (unless (find elem l1) (setq l1 (append l1 (list elem)))))) -(defun remove-from-tree-if (pred tree) +(defun remove-from-tree-if (pred tree &optional atom-processor) "Strip from tree of atoms that satistify predicate" (if (atom tree) (unless (funcall pred tree) - tree) - (let ((car-strip (remove-from-tree-if pred (car tree))) - (cdr-strip (remove-from-tree-if pred (cdr tree)))) + (if atom-processor + (funcall atom-processor tree) + tree)) + (let ((car-strip (remove-from-tree-if pred (car tree) atom-processor)) + (cdr-strip (remove-from-tree-if pred (cdr tree) atom-processor))) (cond ((and car-strip (atom (cadr tree)) (null cdr-strip)) (list car-strip)) @@ -155,12 +157,13 @@ (progn (setf (cdr ,elem) ,value) ,alist) - (setf ,alist (acons ,akey ,value ,alist)))))) + (setf ,alist (acons ,akey ,value ,alist)))))) (defun get-alist (key alist &key (test #'eql)) (cdr (assoc key alist :test test))) (defun (setf get-alist) (value key alist &key (test #'eql)) + "This doesn't work to add a field which alist value is only modified locally" (update-alist key value alist :test test) value) @@ -169,7 +172,7 @@ (defun plist-alist (plist) (do ((alist '()) - (pl plist (cddr plist))) + (pl plist (cddr pl))) ((null pl) alist) (setq alist (acons (car pl) (cadr pl) alist))))