Функционал mapcar принимает в качестве аргументов:
Накапливает и возвращает список результатов, полученных применением f к первым, вторым и т.д. элементам всех списков l1, ..., ln.
(mapcar #'abs (list -10 2.5 -11.6 17))
(10 2.5 11.6 17)
Работу mapcar можно приблизительно выразить с помощью линейной рекурсии:
(defun mapcar1 (f items) (if (null items) () (cons (funcall f (first items)) (mapcar1 f (rest items)))))
scale-list
через MAPCAR
Переопределим ту же scale-list:
(defun scale-list2 (items factor) (mapcar (lambda (x) (* x factor)) items))
Определение через mapcar
Разница между этими двумя определениями состоит не в том, что компьютер выполняет другой процесс, а в том, что мы думаем об этом процессе по-другому.
Функционал mapcar
помогает установить барьер абстракции,
который отделяет реализацию процедур, преобразующих списки,
от деталей того, что делается с его элементами.
Сравните с функционалом maplist, который применяет функциональный аргумент к подспискам — хвостам исходного:
(maplist #'length (list -10 2.5 -11.6 17))
(4 3 2 1)