Функция: в новый список включать только те элементы, которые сами являются списками - 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. Функция принимает два аргумента:

  1. w — углеводородное слово, итерируемое значение которого необходимо обработать.
  2. ac — атомный список, который наполняется в процессе обработки углеводородного слова. Также есть два опциональных аргумента:
  3. a — первый элемент углеводородного слова.
  4. ac — атомный список, который наполняется в процессе обработки углеводородного слова. Внутри функции используется следующая последовательность:
  5. Если w не равно NIL, то рекурсивно вызывается функция drop-atoms для обработки оставшейся части углеводородного слова (cdr w).
  6. Если w равно NIL, то выполняется возврат атомного списка ac.
  7. Если a является списком (listp a), то добавляется его в начало атомного списка ac.
  8. Если a не является списком, то выполняется возврат атомного списка ac.
  9. В конце выполняется возврат атомного списка ac в обратном порядке с помощью функции reverse. Таким образом, функция drop-atoms удаляет все атомы из углеводородного слова и возвращает список, содержащий только те элементы, которые сами являются списками. Пример использования функции:

    (drop-atoms '(a (b a) () c)) ((B A) NIL) В данном примере функция обрабатывает углеводородное слово '(a (b a) () c). На каждом шаге рекурсии она проверяет, является ли текущий элемент списком. Если да, то добавляет его в начало атомного списка ac. Если нет, то просто переходит к следующему элементу. В результате получается список, содержащий только списки, то есть ((B A) NIL).

Оцени полезность:

7   голосов , оценка 3.571 из 5
Похожие ответы