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!