Сгладить список с помощью общего lisp

Я читал книгу Пола Грэма «На Лиспе». В главе 4 «Функции утилит» он приводит примеры небольших функций, которые работают со списками, что было бы полезно при написании более крупной программы.

Один из них являетсяflatten, Если в качестве аргумента для любого произвольного уровня задан вложенный список, flatten удалит все вложенные элементы и поместит их на верхний уровень.

Ниже моя попытка реализации flatten:

(defun flatten (lst)
  (labels ((rflatten (lst1 acc)
                     (dolist (el lst1)
                       (if (listp el)
                         (rflatten el acc)
                         (push el acc)))
                     acc))
    (reverse (rflatten lst nil))))

Но вышеприведенная функция не выравнивает списки должным образом.

; returns (1) instead of (1 2)
(print (flatten '(1 (2))))
(1)

Вызов функции с(1 (2)) возвращается(1) вместо(1 2).

Я не могу найти, что не так с моей реализацией flatten. Это то, как я используюlabels? Или это то, как я используюdolist макрос?dolist макрос всегда возвращаетсяnil, Но это не имеет значения, так как я использую аккумуляторacc хранить свернутый список.

Ответы на вопрос(3)

Ваш ответ на вопрос