Subject: Re: [Q] More beginner help From: Erik Naggum <erik@naggum.no> Date: 2000/01/24 Newsgroups: comp.lang.lisp Message-ID: <3157705666120505@naggum.no> [ please look at how other Common Lisp programmers indent and present their code. parentheses are _not_ visually significant, although they are very syntactically significant, in Lisp source code. don't make them stand out -- please -- you're code is so ugly it's hard to help you with it. ] * Dirt <pip3@inam3.com> | I am trying to "unravel" a list, but with little luck. I wish to take a | list such as: | | (a (b c (d e)) f) | | and create a new list that looks like one top level list: | | (a b c d e f) this is normally called "flattening" a list. | I am trying to do this recursively but I am guessing I am way off because | I get a stack overflow. What I am trying to say in my code below is: | | If the expression is a list, call the function again with the cdr of the | list, otherwise it is an atom so cons it to a list. what you wish to do is to move each element of each list you encounter onto a new list. I'll try to show you with slightly more modern Common Lisp that you're using: (defun flatten (list) (loop for element in list if (listp element) nconc (flatten element) else collect element)) if you actually _need_ recursion, which will only waste space and time, you should be able to unravel this iterative solution easily. in my not so humble opinion, being able to think recursively is very valuable, the second most valuable ability you can have, beaten only by knowing _when_ to use recursion. incidentally, this function considers an empty list a list of no elements while you might want NIL to be a separate element in the resulting list. #:Erik