X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=lists.lisp;h=a2ae23ff6c34d4c6ee20d0e2d7c1f426542d2018;hp=b51c41a5072c396e1bf0a3f7ead8d292d14226be;hb=c0e985428b4aa14bdc5a0688315bc4dbb5142ba3;hpb=03712fbb06acbb103602bae10f41aeae7fa05127 diff --git a/lists.lisp b/lists.lisp index b51c41a..a2ae23f 100644 --- a/lists.lisp +++ b/lists.lisp @@ -73,14 +73,19 @@ 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