Разбиение списков на атомы - Lisp
Формулировка задачи:
не могу никак вникнуть в этот лисп помогите плз.
Написать программу разбиения списков на атомы и превращения атомов в списки на каждом уровне. Если список содержит подсписки, то его не разбивать на атомы.
Пример
((a b) (c ( d e)) f) --> (a b ((c) d e) (f)) (a (b (c)d) e(((f)))) ==> ((a) ((b) c (d))(e)((((f)))))
Решение задачи: «Разбиение списков на атомы»
textual
Листинг программы
(defun inside-out (w) (loop for a in w if (and (listp a) (every #'atom a)) nconc a else collect (if (atom a) (list a) a))) > (inside-out '((a b) (c ( d e)) f)) (A B (C (D E)) (F)) > (inside-out '(a (b (c) d) e (((f))))) ((A) (B (C) D) (E) (((F))))
Объяснение кода листинга программы
- Функция
inside-outпринимает один аргументw. - Вложенным циклом
loopпроходим по каждому элементуaаргументаw. - Если элемент
aявляется списком и все его элементы являются атомами, то добавляем его в результат. - Если элемент
aявляется атомом, то добавляем его в результат в виде списка с одним элементом. - Результат выводится на экран.