New release
[kmrcl.git] / lists.lisp
index b51c41a5072c396e1bf0a3f7ead8d292d14226be..a2ae23ff6c34d4c6ee20d0e2d7c1f426542d2018 100644 (file)
             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