Линеаризация списка Лиспа с картой
Можно ли линеаризовать список с помощью функций карты?
Пример: (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)))))