6.8 管理固定大小的对象环形结构

环形结构(ring) 是一种固定大小的数据结构,支持插入、删除、旋转操作,以及基于模运算的索引引用和遍历。ring 包实现了高效的环形数据结构,并提供本节所列的相关函数。

注意:Emacs 中的若干环形结构(如 kill ring(删除环)和mark ring(标记环))实际上是通过简单列表实现的,并未 使用 ring 包;因此以下函数无法作用于这些环形结构。

Function: make-ring size

该函数返回一个新的环形结构,可容纳 size 个对象。 size 应为整数。

Function: ring-p object

object 是环形结构,该函数返回 t,否则返回 nil

Function: ring-size ring

该函数返回 ring 环形结构的最大容量。

Function: ring-length ring

该函数返回 ring 环形结构当前包含的对象数量。该值绝不会超过 ring-size 函数的返回值。

Function: ring-elements ring

该函数返回 ring 环形结构中所有对象组成的列表,按顺序排列,最新的对象排在首位。

Function: ring-copy ring

该函数返回一个新的环形结构,是 ring 的副本。新环形结构包含与 ring 完全相同(通过 eq 判断)的对象。

Function: ring-empty-p ring

ring 环形结构为空,该函数返回 t,否则返回 nil

环形结构中最新的元素索引始终为 0。索引值越大,对应的元素越旧。索引值按环形结构的长度取模计算。索引 −1 对应最旧的元素,−2 对应第二旧的元素,依此类推。

Function: ring-ref ring index

该函数返回 ring 环形结构中索引 index 处的对象。index 可以是负数,也可以大于环形结构的长度。若 ring 为空,ring-ref 会触发错误。

Function: ring-insert ring object

该函数将 object 插入 ring 环形结构,使其成为最新的元素,并返回 object

若环形结构已满,插入操作会移除最旧的元素,为新元素腾出空间。

Function: ring-remove ring &optional index

ring 环形结构中移除一个对象,并返回该对象。参数 index指定要移除的元素;若该参数为 nil,则表示移除最旧的元素。若 ring 为空,ring-remove 会触发错误。

Function: ring-insert-at-beginning ring object

该函数将 object 插入 ring 环形结构,并将其视作最旧的元素。此函数的返回值无实际意义。

若环形结构已满,该函数会移除最新的元素,为插入的元素腾出空间。

Function: ring-resize ring size

ring 环形结构的容量设置为 size。若新容量更小,则环形结构中最旧的元素会被舍弃。

只要你注意不超出环形结构的容量,就可以把它当作先进先出队列(FIFO) 来使用。例如:

(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")

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike