From: Kevin M. Rosenberg Date: Mon, 22 Mar 2010 19:35:00 +0000 (-0600) Subject: optimize flatten function X-Git-Tag: v1.101~1 X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=commitdiff_plain;h=94c161e4a288d874d8d763b768312e1004a888ec optimize flatten function --- diff --git a/lists.lisp b/lists.lisp index 5cd193c..eaa3f9d 100644 --- a/lists.lisp +++ b/lists.lisp @@ -73,11 +73,14 @@ 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 (listp item) + (map nil #'scan item) + (push item result)))) + (scan tree)) + (nreverse result))) ;;; Keyword functions