Я изо всех сил пытался сгладить структуру дерева. Я делал это рекурсивно, сравнивая каждый атомарный символ с остальными в дереве, но мой друг предложил следующий код, который, на мой взгляд, выглядит чище. Я просто не понимаю строчку:
((atom tree)(list tree))
Я понимаю, что каждый из них делает по отдельности, я также знаю, что цикл ниже принимает список или вызывает ошибку, которая, как я подозреваю, во многом связана с причиной, по которой мы превращаем символ в список, если атом возвращает true. Но я все еще не чувствую, что полностью понимаю код.
(defun flatten (tree)
(cond ((null tree)
nil
)
((atom tree)(list tree))
(t
(loop for a in tree appending (flatten a)))))
Объяснение было бы потрясающим, если бы кто-нибудь мог сэкономить время? Спасибо!