Spłaszczanie struktury drzewa w Lisp

Walczyłem ze spłaszczeniem struktury drzewa. Robiłem to rekurencyjnie, porównując każdy symbol atomowy z resztą drzewa, ale mój przyjaciel zasugerował następujący kod, który moim zdaniem wygląda na czystszy. Po prostu nie rozumiem linii:

((atom tree)(list tree))

Rozumiem, co każdy z nich robi indywidualnie, wiem też, że poniższa pętla pobiera listę lub powoduje błąd, który, jak podejrzewam, ma wiele do zrobienia z powodu, że zamieniamy symbol na listę, jeśli atom zwraca true. Ale wciąż nie czuję, że w pełni rozumiem kod.

(defun flatten (tree)
(cond ((null tree)
     nil
     )
    ((atom tree)(list tree))
    (t
     (loop for a in tree appending (flatten a)))))

Wyjaśnienie byłoby wspaniałe, gdyby ktoś mógł poświęcić czas? Dzięki!

questionAnswers(3)

yourAnswerToTheQuestion