Отображающие функционалы

Отображающие функции повторяют применение функции

  Важный класс функционалов в практическом программировании на языке Лисп образуют отображающие функции или 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 теряет результаты

  Функция mapc также аналогична функции map, но отличается тем, что не собирает и не объединяет результаты. Возникающие результаты просто теряются. Псевдофункционал mapc прежде всего используют для получения побочного эффекта.