Re: flattening a nested list functionally



"John Thingstad" <john.thingstad@xxxxxxxxx> writes:

Wrote this function to flatten a nested list.

(defparameter *test-list* '((1 2 3) (4 5 6 (7 8 9)) 10))

(defun flatten-reverse (element)
(let ((new-element nil))
(mapc
(lambda (e)
(if (consp e)
(setf new-element (append (flatten-reverse e) new-element))
(push e new-element)))
element)
new-element))

(defun flatten (list)
(nreverse (flatten-reverse list)))

CL-USER 27 > (flatten *test-list*)
(1 2 3 4 5 6 7 8 9 10)

Not too bad if I may say so but what I was trying to do was write it in a
purely functional style. How do I do this without introducing a variable?

(defun flatten (list)
(mapcan #'(lambda (e) (if (consp e) (flatten e) (list e))) list))

Doesn't look too good, but it's a start.

Andras

.



Relevant Pages