Функция: в новый список включать только те элементы, которые сами являются списками - Lisp
Формулировка задачи:
Определить функцию,которая для заданного списка формирует новый список по правилу:в новый список включены только те элементы,которые сами являются списками. Пример: (function '(a (b a) () c) Результат: ((b a) () )
Решение задачи: «Функция: в новый список включать только те элементы, которые сами являются списками»
textual
Листинг программы
(defun drop-atoms (w &optional ac &aux (a (car w))) (if w (drop-atoms (cdr w) (if (listp a) (cons a ac) ac)) (reverse ac))) > (drop-atoms '(a (b a) () c)) ((B A) NIL)
Объяснение кода листинга программы
В данном коде представлена функция с именем drop-atoms. Функция принимает два аргумента:
- w — углеводородное слово, итерируемое значение которого необходимо обработать.
- ac — атомный список, который наполняется в процессе обработки углеводородного слова. Также есть два опциональных аргумента:
- a — первый элемент углеводородного слова.
- ac — атомный список, который наполняется в процессе обработки углеводородного слова. Внутри функции используется следующая последовательность:
- Если w не равно NIL, то рекурсивно вызывается функция drop-atoms для обработки оставшейся части углеводородного слова (cdr w).
- Если w равно NIL, то выполняется возврат атомного списка ac.
- Если a является списком (listp a), то добавляется его в начало атомного списка ac.
- Если a не является списком, то выполняется возврат атомного списка ac.
- В конце выполняется возврат атомного списка ac в обратном порядке с помощью функции reverse.
Таким образом, функция drop-atoms удаляет все атомы из углеводородного слова и возвращает список, содержащий только те элементы, которые сами являются списками.
Пример использования функции:
(drop-atoms '(a (b a) () c)) ((B A) NIL) В данном примере функция обрабатывает углеводородное слово '(a (b a) () c). На каждом шаге рекурсии она проверяет, является ли текущий элемент списком. Если да, то добавляет его в начало атомного списка ac. Если нет, то просто переходит к следующему элементу. В результате получается список, содержащий только списки, то есть ((B A) NIL).