r9949: delete-directory-and-files update
[kmrcl.git] / lists.lisp
index 336baa02864fd29363c82ef90949aed6e6cfddae..9793f273d863227009390e794295864af9e63536 100644 (file)
@@ -42,7 +42,7 @@
     (unless (find elem l1)
       (setq l1 (append l1 (list elem))))))
 
     (unless (find elem l1)
       (setq l1 (append l1 (list elem))))))
 
-(defun remove-from-tree-if (pred tree atom-processor)
+(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)
   "Strip from tree of atoms that satistify predicate"
   (if (atom tree)
       (unless (funcall pred tree)
 
 (defmacro update-alist (akey value alist &key (test '#'eql) (key '#'identity))
   "Macro to support below (setf get-alist)"
 
 (defmacro update-alist (akey value alist &key (test '#'eql) (key '#'identity))
   "Macro to support below (setf get-alist)"
-  (let ((elem (gensym)))
-    `(let ((,elem (assoc ,akey ,alist :test ,test :key ,key)))
-       (if ,elem
-          (progn
-            (setf (cdr ,elem) ,value)
-            ,alist)
-       (setf ,alist (acons ,akey ,value ,alist))))))
+  (let ((elem (gensym "ELEM-"))
+       (val (gensym "VAL-")))
+    `(let ((,elem (assoc ,akey ,alist :test ,test :key ,key))
+          (,val ,value))
+       (cond
+       (,elem
+        (setf (cdr ,elem) ,val))
+       (,alist
+        (setf (cdr (last ,alist)) (list (cons ,akey ,val))))
+        (t
+         (setf ,alist (list (cons ,akey ,val)))))
+       ,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))
 
 (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 won't work if the alist is NIL."
   (update-alist key value alist :test test)
   value)
 
   (update-alist key value alist :test test)
   value)