Отфильтровать разность списков по заданному предикату - Lisp
Формулировка задачи:
Решение задачи: «Отфильтровать разность списков по заданному предикату»
(defun task (w v p) (let ((r nil)) (dolist (a w (reverse r)) (when (and (not (member a v)) (funcall p a)) (push a r))))) ==> TASK (task '(1 2 3 4 5 6 7) '(1 2 3) #'oddp) ==> (5 7)
Объяснение кода листинга программы
В коде определена функция task, которая принимает три аргумента: w, v и p.
Первый аргумент w — это список, который необходимо отфильтровать.
Второй аргумент v — это список, который содержит элементы, которые должны остаться в итоговом списке.
Третий аргумент p — это предикат, который определяет условие фильтрации.
В функции используется let для создания переменной r, которая инициализируется как nil.
Затем используется dolist, который перебирает элементы из w в обратном порядке и добавляет каждый элемент, который удовлетворяет предикату p, в r с помощью push.
Наконец, функция возвращает результат r.
При вызове функции task с аргументами '(1 2 3 4 5 6 7)', '(1 2 3)' и #'oddp возвращается список (5 7), что является элементами из первого аргумента, которые не присутствуют во втором аргументе и удовлетворяют предикату oddp.