r9935: fix update-alist
authorKevin M. Rosenberg <kevin@rosenberg.net>
Sat, 28 Aug 2004 02:15:20 +0000 (02:15 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Sat, 28 Aug 2004 02:15:20 +0000 (02:15 +0000)
lists.lisp

index 3115dd5dbe1b99476baf576be214fe4353615686..9793f273d863227009390e794295864af9e63536 100644 (file)
 
 (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))
-  "This doesn't work to add a field which alist value is only modified locally"
+  "This won't work if the alist is NIL."
   (update-alist key value alist :test test)
   value)