Реализовать функционал, который выполняет заданную функцию над всеми элементами списков вида (x1(x2(.)(x3)(.)(.) - Lisp
Формулировка задачи:
Реализовать функционал, который выполняет заданную функцию над всеми элементами списков вида (x1(x2(...)(x3)(...)(...)))
Подскажите, что тут надо сделать? Непонятна суть задачи, а уж как делать..
Решение задачи: «Реализовать функционал, который выполняет заданную функцию над всеми элементами списков вида (x1(x2(.)(x3)(.)(.)»
textual
Листинг программы
(defun uMap (lst f) (mapcar (lambda (x) (if (atom x) (funcall f x) (uMap x f))) lst)) ==> UMAP (umap '(1 (2 (3 (4)))) (lambda (x) (+ x 5))) ==> (6 (7 (8 (9)))) (uMap '("asd" ("qwe" ("rty" "uu") ((("vbn"))))) 'strRev) ==> ("dsa" ("ewq" ("ytr" "uu") ((("nbv"))))) (uMap '(1 (2 (3 (4)))) (lambda (x) (/ 1 x))) ==> (1 (1/2 (1/3 (1/4))))
Объяснение кода листинга программы
Функция uMap
принимает два аргумента: lst
и f
.
Алгоритм работы функции следующий:
mapcar
применяет функциюf
к каждому элементу спискаlst
.- Если элемент является атомом, то
funcall
вызывает функциюf
с этим элементом в качестве аргумента. - Если элемент является списком, то рекурсивно вызывается функция
uMap
с этим элементом и функциейf
в качестве аргументов. - Результатом работы функции
uMap
является список, в котором каждый элемент обработан с помощью функцииf
. Например, для спискаlst = (1 (2 (3 (4)))
и функцииf = (lambda (x) (+ x 5))
результатом будет(6 (7 (8 (9)))
— каждый элемент спискаlst
был увеличен на 5 с помощью функцииf
. Для спискаlst =
asd(
qwe(
rty`uu
) (((vbn
)))и функции
f = (lambda (x) (strRev x))результатом будет ``dsa
(ewq
(ytr
uu
) (((nbv
)))— каждый элемент списка
lstбыл перевернут с помощью функции
f. Для списка
lst = (1 (2 (3 (4))))и функции
f = (lambda (x) (/ 1 x))результатом будет
(1 (1/2 (1/3 (1/4))))— каждый элемент списка
lstбыл разделен на 1 с помощью функции
f`.