Важный класс функционалов в практическом программировании на языке Лисп образуют отображающие функции или map-функции (mapping function). Map-функционалы являются функциями, которые некоторым образом отображают (map) список (вектор) в новый элемент или порождают побочный эффект. Вызов map-функции имеет вид:
(obj-seq map fn argseq1 … argseqn)
Здесь obj-seq argseq1 … argseqn - списки (вектора), а fn - функция от n аргументов. Как правило, map-функция применяется к функции без аргументов.
(obj-seq map fn)
Результатом этих вычислений будет список (вектор), состоящий из результатов применения функции. Все вычисления производятся параллельно. Например, в случае одного списка объектов получается следующее соответствие:
('(x1 x2 … xn) map fn)
≡
(nil list ('x1 fn) ('x2 fn) … ('xn fn))
В качестве значения функционала возвращается список, построенный из результатов вызовов функционального аргумента map. Приведём пример:
>('l set '(1 2 3)) (1 2 3) >(l map 'oddp) (1 false 3) >(l map '(lambda () (nil list (nil progn (cout writeln this) this)))) 2 1 ; параллельное исполнение 3 ((1) (2) (3)) >(nil defmethod pair () (nil list this 'x)) (lambda () (nil list this 'x)) >(l map 'pair) ((1 x) (2 x) (3 x))
Использованные выше функции (oddp, pair) были функциями без аргументов, т.е. каждый раз они имеют дело с одним элементом. Если бы функции map был передан функциональный аргумент fn с большим количеством параметров, то и у map-функционала было бы соответствующее количество параметров-списков.
В приведённом ниже вызове, например, функциональным аргументом map является функция cons, которая требует двух аргументов. Вызов map строит список пар из соответствующих элементов двух просматриваемых списков:
>(l map '(lambda (x) (nil cons this x)) '(a b c)) ((1 . a) (2 . b) (3 . c)) >(#(1 2 3) map '(lambda (x) (nil list this x)) #(a b c)) #((1 a) (2 b) (3 c))
map можно определить через используемый в Лиспе применяющий функционал. Для случая функционального аргумента без параметров функция map выглядела бы следующим образом:
(nil defmethod map (fn) (nil if (nil consp this) (nil cons (nil funcall (this first) fn) ((this rest) map fn))))
Функционал map используется для программирования циклов специального вида и в определении других функций, поскольку с их помощью можно сократить запись повторяющихся вычислений.
Функция mapc также аналогична функции map, но отличается тем, что не собирает и не объединяет результаты. Возникающие результаты просто теряются. Псевдофункционал mapc прежде всего используют для получения побочного эффекта.