5.9 管理固定大小的对象环
这节描述操作环的函数。一个环指的是固定长度的数据结构,它支持插入、删除、旋转、基于模的索引以及遍历。
— 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中,将其做为最旧的元素。返回值并不重要。
如果环是空的,此函数移除最新的元素以及给待插入的元素腾空间。
如果你小心的不要越过环的大小,你可以将环当做先进先出队列。例如:
(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")