Add recommended targets to debian/rules
[kmrcl.git] / lists.lisp
index b51c41a5072c396e1bf0a3f7ead8d292d14226be..c33d845148e801d06f68524b746513023b88ba72 100644 (file)
@@ -7,8 +7,6 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Apr 2000
 ;;;;
-;;;; $Id$
-;;;;
 ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;;
 ;;;; KMRCL users are granted the rights to distribute and use this software
             it
             nil)))))
 
-(defun flatten (lis)
-  (cond ((atom lis) lis)
-        ((listp (car lis))
-         (append (flatten (car lis)) (flatten (cdr lis))))
-        (t (append (list (car lis)) (flatten (cdr lis))))))
+(defun flatten (tree)
+  (let ((result '()))
+    (labels ((scan (item)
+               (if (consp item)
+                   (map nil #'scan item)
+                   (push item result))))
+      (scan tree))
+    (nreverse result)))
 
 ;;; Keyword functions
 
+;; ECL doesn't allow FOR clauses after UNTIL.
+#-ecl
 (defun remove-keyword (key arglist)
   (loop for sublist = arglist then rest until (null sublist)
         for (elt arg . rest) = sublist
          (setf (cdr ,elem) ,val))
         (,alist
          (setf (cdr (last ,alist)) (list (cons ,akey ,val))))
-         (t
-          (setf ,alist (list (cons ,akey ,val)))))
+        (t
+         (setf ,alist (list (cons ,akey ,val)))))
        ,alist)))
 
 (defun get-alist (key alist &key (test #'eql))
   (update-alist key value alist :test test)
   value)
 
+(defun remove-alist (key alist &key (test #'eql))
+  "Removes a key from an alist."
+  (remove key alist :test test :key #'car))
+
+(defun delete-alist (key alist &key (test #'eql))
+  "Deletes a  key from an alist."
+  (delete key alist :test test :key #'car))
+
 (defun alist-plist (alist)
   (apply #'append (mapcar #'(lambda (x) (list (car x) (cdr x))) alist)))