Из произвольного(с вложенностью) списка удалить все элементы, являющиеся числом или символом - Lisp

Узнай цену своей работы

Формулировка задачи:

Из произвольного(с вложенностью) списка удалить все элементы, являющиеся числом или символом. То есть вывести элементы, являющиеся строками

Решение задачи: «Из произвольного(с вложенностью) списка удалить все элементы, являющиеся числом или символом»

textual
Листинг программы
(defun tree-remove-if (f tree)
  "Delete tree elements by predicate"
  (cond ((null tree) nil)
        ((listp (car tree))
         (cons  (tree-remove-if f (car tree))
                (tree-remove-if f (cdr tree))))
        ((funcall f (car tree))
         (tree-remove-if f (cdr tree)))
        (T (cons (car tree)
                 (tree-remove-if f (cdr tree))))))
 
(defun tree-remove-if-not (f tree)
  "Delete tree elements by not predicate"
  (cond ((null tree) nil)
        ((listp (car tree))
         (cons  (tree-remove-if-not f (car tree))
                (tree-remove-if-not f (cdr tree))))
        ((funcall f (car tree))
         (cons (car tree)
               (tree-remove-if-not f (cdr tree))))
        (T (tree-remove-if-not f (cdr tree)))))
 
(tree-remove-if
  #'(lambda (x) (or (numberp x) (symbolp x)))
  '(1 2 3 4 5 (Brown (Fox 6)) "jumps"))
 
(tree-remove-if-not
  'stringp
  '(1 2 3 4 5 (Brown (Fox 6)) "jumps"))

Объяснение кода листинга программы

В первом куске кода, в функции tree-remove-if, определённый анонимный функцию, которая удаляет элементы из списка, используя другую функцию (называемую f) в качестве фильтра. Эта функция применяет этот фильтр к каждому элементу списка, и если элемент соответствует, он удаляется. Если элемент не соответствует, он добавляется в новый список. Эта функция применяется рекурсивно к каждому элементу списка, пока не будет просмотрено все элементы. Во втором куске кода, в функции tree-remove-if-not, определённый анонимный функцию, которая также удаляет элементы из списка, используя другую функцию (называемую f) в качестве фильтра. Однако, вместо того чтобы удалять элементы, которые соответствуют фильтру, эта функция удаляет элементы, которые НЕ соответствуют фильтру. В третьем куске кода, функция tree-remove-if применяется к списку '(1 2 3 4 5 (Brown (Fox 6))jumps) с фильтром #'(lambda (x) (or (numberp x) (symbolp x))). Эта функция удаляет все числа и символы из списка, оставляя только остальные элементы. Результатом является список'(1 2 3 4 5 (Brown (Fox 6)) jumps). В четвёртом куске кода, функцияtree-remove-if-notприменяется к списку'(1 2 3 4 5 (Brown (Fox 6)) jumps)с фильтром'stringp. Эта функция удаляет все элементы, которые являются строками, из списка, оставляя только остальные элементы. Результатом является список'(1 2 3 4 5 (Brown (Fox 6)) jumps)`.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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