;; With mapcan (defun my-flatten (lst) (mapcan #'(lambda (item) (if (listp item) (my-flatten item) (list item)) ) lst)) ;; With reduce (defun my-flatten (lst) (reduce #'(lambda (accumulator item) (if (listp item) (append accumulator (my-flatten item)) (append accumulator (list item))) ) lst :initial-value '())) ;; C-c C-k (assert (equal (my-flatten '()) '())) (assert (equal (my-flatten '(a b c)) '(A B C))) (assert (equal (my-flatten '((a b) c d)) '(A B C D))) (assert (equal (my-flatten '(a (b (c d) e))) '(A B C D E)))