环形结构(ring) 是一种固定大小的数据结构,支持插入、删除、旋转操作,以及基于模运算的索引引用和遍历。ring 包实现了高效的环形数据结构,并提供本节所列的相关函数。
注意:Emacs 中的若干环形结构(如 kill ring(删除环)和mark ring(标记环))实际上是通过简单列表实现的,并未 使用 ring 包;因此以下函数无法作用于这些环形结构。
该函数返回一个新的环形结构,可容纳 size 个对象。 size 应为整数。
若 object 是环形结构,该函数返回 t,否则返回 nil。
该函数返回 ring 环形结构的最大容量。
该函数返回 ring 环形结构当前包含的对象数量。该值绝不会超过 ring-size 函数的返回值。
该函数返回 ring 环形结构中所有对象组成的列表,按顺序排列,最新的对象排在首位。
该函数返回一个新的环形结构,是 ring 的副本。新环形结构包含与 ring 完全相同(通过 eq 判断)的对象。
若 ring 环形结构为空,该函数返回 t,否则返回 nil。
环形结构中最新的元素索引始终为 0。索引值越大,对应的元素越旧。索引值按环形结构的长度取模计算。索引 −1 对应最旧的元素,−2 对应第二旧的元素,依此类推。
该函数返回 ring 环形结构中索引 index 处的对象。index 可以是负数,也可以大于环形结构的长度。若 ring 为空,ring-ref 会触发错误。
该函数将 object 插入 ring 环形结构,使其成为最新的元素,并返回 object。
若环形结构已满,插入操作会移除最旧的元素,为新元素腾出空间。
从 ring 环形结构中移除一个对象,并返回该对象。参数 index指定要移除的元素;若该参数为 nil,则表示移除最旧的元素。若 ring 为空,ring-remove 会触发错误。
该函数将 object 插入 ring 环形结构,并将其视作最旧的元素。此函数的返回值无实际意义。
若环形结构已满,该函数会移除最新的元素,为插入的元素腾出空间。
将 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")