Задача на написание функции, выполняющей обработку - Lisp
Формулировка задачи:
Здравствуйте, помогите пожалуйста с заданием, никак не получается решить; нужно написать функцию, выполняющую обработку и привести набор тестовых вызовов описанной функции, демонстрирующих все варианты ее работы.
1. Описать функцию, которая определяла бы положение атома в списке (воз-
вращала бы порядковый номер атома в списке).
2. Описать функцию, которая, выдавала бы элемент списка по заданному но-
меру.
3. Описать функцию, которая находила бы сумму всех числовых элементов в
списке.
Решение задачи: «Задача на написание функции, выполняющей обработку»
textual
Листинг программы
(defun pos (a lst) (let ((i 0)) (dolist (x lst nil) (when (eq a x) (return i)) (setq i (+ i 1))))) ==> POS (pos 5 '(1 2 3 4 5 6)) ==> 4 (pos 55 '(1 2 3 4 5 6)) ==> NIL (defun get-by-num (n lst) (dotimes (i n (car lst)) (setq lst (cdr lst)))) ==> GET-BY-NUM (get-by-num 1 '(a b c)) ==> B (get-by-num 0 '(a b c)) ==> A (get-by-num 10 '(a b c)) ==> NIL (defun sum-num (lst) (let ((s 0)) (dolist (i lst s) (when (numberp i) (setq s (+ i s)))))) ==> SUM-NUM (sum-num '(d f 5 6 d)) ==> 11 (sum-num '(d f 5 6 (d))) ==> 11
Объяснение кода листинга программы
- Написана функция
pos, которая принимает два аргумента:aиlst. - Функция
posищет элементaв спискеlstи возвращает его индекс. - Если элемент
aнайден, функция возвращает его индекс. Если элементaне найден, функция продолжает перебирать списокlstи увеличивать значение переменнойiна 1. - Значение переменной
iувеличивается на 1 после каждой итерации цикла. - Если элемент
aне найден, функция возвращаетnil. - Написана функция
get-by-num, которая принимает три аргумента:n,lstи возвращает элемент спискаlstс индексомn. - Функция
get-by-numиспользует циклdotimes, чтобы перебрать элементы спискаlstс индексами от 0 доn. - Если индекс
iменьше или равенn, функция возвращает элемент спискаlstс индексомi. - Если индекс
iбольшеn, функция возвращаетnil. - Написана функция
sum-num, которая принимает один аргумент:lst. - Функция
sum-numищет все числовые элементы в спискеlstи возвращает их сумму. - Функция
sum-numиспользует циклdolist, чтобы перебрать элементы спискаlst. - Если элемент
iявляется числом, функция увеличивает значение переменнойsна суммуiиs. - Если элемент
iне является числом, функция пропускает его и переходит к следующей итерации цикла. - Функция
sum-numвозвращает сумму всех числовых элементов в спискеlst. - Если список
lstпуст, функция возвращает 0. - Если список
lstсодержит только символы, функция возвращает 0. - Если список
lstсодержит только нечисловые элементы, функция возвращает 0. - Если список
lstсодержит только числовые элементы, функция возвращает их сумму. - Если список
lstсодержит как числовые, так и нечисловые элементы, функция возвращает 0.