Spec-Zone.ru › Elisp

Функции отображения

Функция отображения применяет заданную функцию (не специальную форму или макрос) к каждому элементу последовательности, например списка, вектора или строки (см. Последовательности, массивы и векторы). В Emacs Lisp есть несколько таких функций; в этом разделе описаны mapcar, mapc, mapconcat и mapcan, которые отображают последовательности. Описание функции mapatoms, которая отображает символы в obarray, см. в разделе Определение mapatoms. Описание функции maphash, которая отображает пары «ключ/значение» в хеш-таблице, см. в разделе Определение maphash.

Эти функции отображения не работают с таблицами символов, поскольку таблица символов — это разреженный массив с очень большим номинальным диапазоном индексов. Чтобы отобразить таблицу символов с учётом её разреженной структуры, используйте функцию map-char-table (см. Таблицы символов).

Функция: mapcar function sequence

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")
;; Call each function in my-hooks.
(mapcar 'funcall my-hooks)
(defun mapcar* (function &rest args)
  "Apply FUNCTION to successive cars of all ARGS.
Return the list of results."
  ;; If no list is exhausted,
  (if (not (memq nil args))
      ;; apply function to CARs.
      (cons (apply function (mapcar #'car args))
            (apply #'mapcar* function
                   ;; Recurse for rest of elements.
                   (mapcar #'cdr args)))))
(mapcar* #'cons '(a b c) '(1 2 3 4))
     ⇒ ((a . 1) (b . 2) (c . 3))
Функция: mapcan function sequence

Эта функция применяет function к каждому элементу sequence, как mapcar, но вместо сбора результатов в список возвращает один список со всеми элементами результатов (которые должны быть списками), изменяя сами результаты (с помощью nconc; см. Функции перестановки списков). Как и в случае с mapcar, sequence может иметь любой тип, кроме таблицы символов.

;; Contrast this:
(mapcar #'list '(a b c d))
     ⇒ ((a) (b) (c) (d))
;; with this:
(mapcan #'list '(a b c d))
     ⇒ (a b c d)
Функция: mapc function sequence

mapc похожа на mapcar, но function используется только для побочных эффектов: возвращаемые ею значения игнорируются, а не собираются в список. mapc всегда возвращает sequence.

Функция: mapconcat function sequence &optional separator

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"

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Mapping-Functions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API