Удалить атом из списка произвольной структуры - Lisp
Формулировка задачи:
(defun del (a L) (cond ((null L) nil) ((atom L) (cond ((eq a L) nil) (t L))) ((eq a (car L)) (del a (cdr L))) (t (cons (del a (car l)) (del a (cdr l))))))
Решение задачи: «Удалить атом из списка произвольной структуры»
(Defun RunDelItem (L A) (MapCon '(Lambda (L2) (If (Eq (Car L2) A) Nil (List (Car L2)))) L )) (defun DelItem (A L) (cond ((Not (Atom A)) nil) (((ListP L)) nil) (T (RunDelItem L A)) ) )
Объяснение кода листинга программы
В коде представлена функция RunDelItem, которая принимает два аргумента - список L и атом A. Функция удаляет все вхождения атома A из списка L.
Список L передается во внутреннюю функцию MapCon, которая применяет к каждому элементу списка L2 функцию Lambda. Внутри функции Lambda проверяется, является ли первый элемент списка L2 равным атому A. Если это так, то возвращается Nil, иначе возвращается список без изменений.
Функция DelItem принимает два аргумента - атом A и список L. В функции используется конструкция cond, которая проверяет различные условия и возвращает соответствующее значение. Если A не является атомом, то возвращается nil. Если L является списком, то возвращается nil. В противном случае вызывается функция RunDelItem с аргументами L и A.
Таким образом, код представляет собой функцию DelItem, которая удаляет атом из списка, используя функцию RunDelItem.