Написать функцию для списка с произвольной иерархией, которая определяет принадлежность атома X строке L - Lisp
Формулировка задачи:
Решение задачи: «Написать функцию для списка с произвольной иерархией, которая определяет принадлежность атома X строке L»
(defun inside (e w) (cond ((null w) nil) ((equal (car w) e)) ((listp (car w)) (or (inside e (car w)) (inside e (cdr w)))) ((inside e (cdr w))))) > (inside 'a '(q (a w) e r)) T > (inside 'a '(q (w) e r)) NIL (defun inside (e w &aux (a (car w)) (d (cdr w))) (cond ((null w) nil) ((equal a e)) ((listp a) (or (inside e a) (inside e d))) ((inside e d)))) > (inside 'a '(q (a w) e r)) T > (inside 'a '(q (w) e r)) NIL (defun inside (e w) (when w (cond ((equal a e)) ((listp a) (or (inside e a) (inside e d))) ((inside e d))))) > (inside 'a '(q (a w) e r)) T > (inside 'a '(q (w) e r)) NIL (defun inside (e w) (loop for a in w thereis (or (equal a e) (when (listp a) (inside e a))))) > (inside 'a '(q (a w) e r)) T > (inside 'a '(q (w) e r)) NIL
Объяснение кода листинга программы
Функция inside, которая принимает два аргумента, e и w, и возвращает T, если элемент e находится внутри элемента списка w, и NIL в противном случае. Список w может содержать произвольную иерархию, и функция должна рекурсивно вызываться для каждого подэлемента списка. Код сначала использует структуру cond для проверки типа списка w. Если w — это NIL, функция возвращает NIL. Если w — это атом, функция проверяет, равен ли он e. Если w — это список, функция рекурсивно вызывает себя для первого элемента списка (car w) и, если это не сработает, для остальной части списка (cdr w). Второй код использует переменные a и d для хранения первого и остального элементов списка w. Функция снова использует структуру cond для проверки типа списка. Если w — это NIL, функция возвращает NIL. Если a равно e, функция возвращает T. Если a — это список, функция рекурсивно вызывает себя для элемента e и списка a. Если это не сработает, функция рекурсивно вызывает себя для элемента e и списка d. Если w — это атом, функция возвращает NIL. Третий код использует цикл loop для итерации по каждому элементу списка w. Функция снова проверяет, равен ли элемент e. Если это не сработает, функция рекурсивно вызывает себя для элемента e и списка a. Все четыре куска кода дают одинаковый результат для входных данных 'a '(q (a w) e r), где функция inside возвращает T, а для входных данных 'a '(q (w) e r) функция inside возвращает NIL, что указывает на то, что элемент 'a' не находится в списке.