MAPCAR - функционал отображения списков

Функционал 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

  1. избавляет от лишних подробностей — оно короче,
  2. подчеркивает, что список элементов преобразуется в список результатов умножения.

Разница между этими двумя определениями состоит не в том, что компьютер выполняет другой процесс, а в том, что мы думаем об этом процессе по-другому.

Функционал mapcar помогает установить барьер абстракции, который отделяет реализацию процедур, преобразующих списки, от деталей того, что делается с этими элементами.

Сравните с функционалом maplist, который применяет функциональный аргумент к подспискам — хвостам исходного:

(maplist #'length (list -10 2.5 -11.6 17))
(4 3 2 1)