Управление кольцом объектов фиксированного размера
Кольцо — это структура данных фиксированного размера, поддерживающая вставку, удаление, вращение и доступ к элементам по индексу по модулю, а также обход. Эффективная структура данных кольца реализована в пакете ring. Она предоставляет функции, перечисленные в этом разделе.
Обратите внимание, что несколько колец в Emacs, такие как кольцо вырезания и кольцо маркировки, фактически реализованы как простые списки, а не с использованием пакета ring; следовательно, следующие функции не будут работать с ними.
- Функция: make-ring размер
Возвращает новое кольцо, способное содержать размер объектов. размер должен быть целым числом.
- Функция: ring-p объект
Возвращает
t, если объект является кольцом,nil, в противном случае.
- Функция: ring-size кольцо
Возвращает максимальную вместимость кольца.
- Функция: ring-length кольцо
Возвращает количество объектов, которые кольцо в данный момент содержит. Значение никогда не превысит значение, возвращаемое
ring-size.
- Функция: ring-elements кольцо
Возвращает список объектов в кольце в порядке, начиная с последнего добавленного.
- Функция: ring-copy кольцо
Возвращает новое кольцо, являющееся копией кольца. Новое кольцо содержит те же (
eq) объекты, что и кольцо.
- Функция: ring-empty-p кольцо
Возвращает
t, если кольцо пусто,nil, в противном случае.
Самый последний элемент в кольце всегда имеет индекс 0. Более высокие индексы соответствуют более старым элементам. Индексы вычисляются по модулю длины кольца. Индекс -1 соответствует самому старому элементу, -2 — следующему за ним по старшинству и так далее.
- Функция: ring-ref кольцо индекс
Возвращает объект в кольце по индексу индекс. индекс может быть отрицательным или больше длины кольца. Если кольцо пусто,
ring-refсигнализирует об ошибке.
- Функция: ring-insert кольцо объект
-
Вставляет объект в кольцо, делая его последним элементом, и возвращает объект.
Если кольцо заполнено, вставка удаляет самый старый элемент, чтобы освободить место для нового элемента.
- Функция: ring-remove кольцо &опционально индекс
Удаляет объект из кольца и возвращает этот объект. Аргумент индекс указывает, какой элемент удалить; если он
nil, это означает удаление самого старого элемента. Если кольцо пусто,ring-removeсигнализирует об ошибке.
- Функция: ring-insert-at-beginning кольцо объект
-
Вставляет объект в кольцо, рассматривая его как самый старый элемент. Возвращаемое значение не имеет значения.
Если кольцо заполнено, эта функция удаляет последний элемент, чтобы освободить место для вставляемого элемента.
- Функция: ring-resize кольцо размер
Устанавливает размер кольца в размер. Если новый размер меньше, то самые старые элементы в кольце отбрасываются.
Если вы соблюдаете осторожность, чтобы не превысить размер кольца, вы можете использовать кольцо как очередь с очередностью «первым вошел, первым вышел». Например:
(let ((fifo (make-ring 5)))
(mapc (lambda (obj) (ring-insert fifo obj))
'(0 one "two"))
(list (ring-remove fifo) t
(ring-remove fifo) t
(ring-remove fifo)))
⇒ (0 t one t "two")
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Rings.html