Subject: Re: clever flatten? From: Erik Naggum <erik@naggum.no> Date: 1996/02/10 Newsgroups: comp.lang.lisp Message-ID: <19960210T235219Z@arcana.naggum.no> [Sunil Mishra] | Why not write your own function? I don't really understand what the | constraints are, perhaps I should give an example of what might work, | and you tell me what's wrong with it. I'm also trying to keep memory | constraints in mind, and this will result in an ugly function. | | (defun flatten (tree &aux (output '(())) output-end) | (declare (special output-end)) | (setq output-end output) | (flatten-loop tree) | (cdr output)) | | (defun flatten-loop (tree) | (declare (special output-end)) | (mapc #'(lambda (tree-el) | (cond ((listp tree-el) | (flatten-loop tree-el)) | (t (push tree-el (cdr output-end)) | (setq output-end (cdr output-end))))) | tree)) using a lexical variable in a closure around a `labels' form, you could do away with the expensive special variable and the separate function. #<Erik 3032985139133767> -- imagine if the buyers of the first PC's with PC-DOS didn't have to upgrade.