Линеаризация списка Лиспа с картой

Можно ли линеаризовать список с помощью функций карты?
Пример: (1 2 (3 (4 5) 6)) -> (1 2 3 4 5 6)

Мой неправильный подход:

(defun f1 (x)
    (cond
        ((atom x) x)
        (t (f2 x))
    )
)

(defun f2 (lst)
    (mapcar 'f1 lst)
)

2 ответа

Решение

Да карта хоть и нет mapcar но mapcan:

(defun flatten (lst)
  (mapcan
     #'(lambda (a)
         (cond
           ((atom a) (list a))
           (T (flatten a))))
     lst))

И если под Лиспом вы имели в виду Scheme или что-то подобное, попробуйте append-map, flat-map, flatMap или же mapcat вместо Общего Лиспа mapcan,

Я бы не назвал это linearize a list но сгладить список.

(defun flatten (lst)
"Flatten the list lst"
  (cond ((null lst) nil)
        ((atom lst) (list lst))
        (t (loop for e in lst appending (flatten e)))))
Другие вопросы по тегам