Функция отображения применяет заданную функцию (не специальную форму или макрос) к каждому элементу последовательности, такой как список, вектор или строка (см. Последовательности, массивы и векторы).
Emacs Lisp имеет несколько таких функций; в этом разделе описываются
mapcar, mapc, mapconcat и mapcan, которые
отображают элементы последовательностей. См. Определение mapatoms, для функции
mapatoms, которая отображает символы в obarray.
См. Определение maphash, для функции maphash, которая
отображает пары ключ/значение в хеш-таблице.
Эти функции отображения не работают с таблицами символов, потому что таблица символов
является разреженным массивом, номинальный диапазон индексов которого очень велик. Чтобы отобразить
элементы таблицы символов таким образом, чтобы правильно учесть ее разреженную природу,
используйте функцию map-char-table (см. Таблицы символов).
mapcar применяет function к каждому элементу sequence
поочередно и возвращает список результатов.
Аргумент sequence может быть любой последовательностью, кроме таблицы символов; то есть списком, вектором, булевым вектором или строкой. Результат всегда является списком. Длина результата совпадает с длиной sequence. Например:
(mapcar #'car '((a b) (c d) (e f)))
⇒ (a c e)
(mapcar #'1+ [1 2 3])
⇒ (2 3 4)
(mapcar #'string "abc")
⇒ ("a" "b" "c")
;; Вызвать каждую функцию в my-hooks.
(mapcar 'funcall my-hooks)
(defun mapcar* (function &rest args) "Применить FUNCTION к последовательным CARs всех ARGS. Вернуть список результатов." ;; Если ни один список не исчерпан, (if (not (memq nil args)) ;; применить функцию к CARам. (cons (apply function (mapcar #'car args)) (apply #'mapcar* function ;; Рекурсивно для оставшихся элементов. (mapcar #'cdr args)))))
(mapcar* #'cons '(a b c) '(1 2 3 4))
⇒ ((a . 1) (b . 2) (c . 3))
Эта функция применяет function к каждому элементу
sequence, как mapcar, но вместо сбора
результатов в список она возвращает один список со всеми элементами
результатов (которые должны быть списками), изменяя результаты (используя
nconc; см. Функции, переупорядочивающие списки). Как и с mapcar,
sequence может быть любого типа, кроме таблицы символов.
;; Сравните это: (mapcar #'list '(a b c d)) ⇒ ((a) (b) (c) (d)) ;; с этим: (mapcan #'list '(a b c d)) ⇒ (a b c d)
mapc подобен mapcar, за исключением того, что function используется только для
побочных эффектов — возвращаемые значения игнорируются, а не собираются
в список. mapc всегда возвращает sequence.
mapconcat применяет function к каждому элементу
sequence; результаты, которые должны быть последовательностями символов
(строками, векторами или списками), конкатенируются в одну строку возвращаемого значения. Между каждой парой
результатов mapconcat вставляет символы из separator, который также должен быть
строкой, вектором или списком символов; значение nil рассматривается как пустая строка. См. Последовательности, массивы и векторы.
Аргумент function должен быть функцией, которая может принимать один аргумент и возвращать последовательность символов: строку, вектор или список. Аргумент sequence может быть любой последовательностью, кроме таблицы символов; то есть списком, вектором, булевым вектором или строкой.
(mapconcat #'symbol-name
'(The cat in the hat)
" ")
⇒ "The cat in the hat"
(mapconcat (lambda (x) (format "%c" (1+ x)))
"HAL-8000")
⇒ "IBM.9111"