Не понимаю, что делает части кода - Lisp
Формулировка задачи:
Всем привет. Есть пример кода с заданием. Имеется произвольный список, состоящий из числовых атомов. Преобразовать список по следующему правилу: если элементы некоторого подсписка являются числами, заменить подсписок суммой его элементов.
(1 (2 ( 3 4 5) 6)(7 8 9)) —> (1(2 (12) 6)(24))
Не понимаю что именно делает ltonum и lnum. В чем их задача? Помогите разобраться пожалуйста.
(defun f1 (x) (cond ((numberp x) x) ((null x) NIL) (T (if (lnum x) (ltonum x) ( cons (f1 (car x))(f1 (cdr x))))) )) (defun ltonum (x) (cond ((null (cdr x)) x) (T (ltonum(cons (+ (car x) (cadr x)) (cddr x) ))) )) (defun Lnum (x) (cond ((null x) T) (T (If(numberp(car x)) (Lnum (cdr x)) NIL)) ))
Решение задачи: «Не понимаю, что делает части кода»
textual
Листинг программы
(defun sum-numbers (w) (loop for a in w collect (if (listp a) (conditional-sum a) a))) (defun conditional-sum (w) (if (every #'numberp w) (list (reduce #'+ w)) (sum-numbers w))) > (sum-numbers '(1 (2 (3 4 5) 6) (7 8 9))) (1 (2 (12) 6) (24)) > (sum-numbers '(1 (2 3))) (1 (5)) > (sum-numbers '(1 2)) (1 2) > (sum-numbers '(1)) (1) > (sum-numbers '()) NIL
Объяснение кода листинга программы
- Сначала определяется функция
sum-numbers, которая принимает один аргументw. - В функции
sum-numbersиспользуется циклloop, который перебирает каждый элементaв аргументеw. - Если элемент
aявляется списком, то выполняется функцияconditional-sumдля этого элемента. - Если элемент
aне является списком, то он просто добавляется в результат. - Результатом работы функции
sum-numbersявляется список, содержащий все числа из аргументаw. - Затем определяется функция
conditional-sum, которая также принимает один аргументw. - В функции
conditional-sumиспользуется условная конструкцияif, которая проверяет, все ли элементы в аргументеwявляются числами. - Если все элементы являются числами, то выполняется функция
reduceс оператором+для получения суммы всех чисел. - Если хотя бы один элемент не является числом, то вызывается функция
sum-numbersдля аргументаw. - Результатом работы функции
conditional-sumявляется число или список, в зависимости от типа элементов в аргументеw. - В конце примера кода вызывается функция
sum-numbersс разными аргументами и выводятся результаты. - Если аргумент пустой, то результатом будет
NIL.