Previous: , Up: Sequences Arrays Vectors   [Contents][Index]


6.8 Managing a Fixed-Size Ring of Objects

リング(ring)は、挿入、削除、ローテーション、剰余(modulo)でインデックスづけされた参照と走査(traversal)をサポートする、固定長のデータ構造です。ringパッケージにより、効率的なリングデータ構造が実装されています。このパッケージは、このセクションにリストされた関数を提供します。

killリングやマークリングのような、Emacsにあるいくつかの“リング”は、実際には単なるリストとして実装されていることに注意してください。したがって、これらのリングにたいしては、以下の関数は機能しないでしょう。

Function: make-ring size

この関数は、sizeオブジェクトを保持できる、新しいリングをreturnします。sizeは整数です。

Function: ring-p object

この関数は、objectがリングの場合はt、それ以外はnilをreturnします。

Function: ring-size ring

この関数は、ringの最大の要素数をreturnします。

Function: ring-length ring

この関数は、ringに現在含まれている、オブジェクトの数をreturnします。値は、ring-sizeでreturnされる値を超えることはありません。

Function: ring-elements ring

この関数は、ring内のオブジェクトのリストをreturnします。リストの順序は、新しいオブジェクトが先頭になります。

Function: ring-copy ring

個の関数は、ringのコピーを新しいリングとしてreturnします。新しいリングは、ringと同じ(eqな)オブジェクトを含みます。

Function: ring-empty-p ring

この関数は、ringが空の場合はt、それ以外はnilをreturnします。

リング内の1番新しい要素は、常にインデックス0をもちます。より大きいインデックスは、より古い要素に対応します。インデックスは、リング長のmoduloにより計算されます。インデックス-1は1番古い要素、-2は次に古い要素、...となります。

Function: ring-ref ring index

この関数はインデックスindexにあるring内のオブジェクトをreturnします。indexには負、またはリング長より大きい数を指定できます。ringがからの場合、ring-refはエラーをシグナルします。

Function: ring-insert ring object

この関数は、1番新しい要素としてobjectringに挿入し、objectをreturnします。

リングが一杯の場合、新しい要素のための空きを作るため、挿入により1番古い要素が削除されます。

Function: ring-remove ring &optional index

ringからオブジェクトを削除して、そのオブジェクトをreturnします。引数indexは、どのアイテムを削除するかを指定します。これがnilの場合、それは1番古いアイテムを削除することを意味します。ringが空の場合、ring-removeはエラーをシグナルします。

Function: ring-insert-at-beginning ring object

この関数は、1番古い要素として、objectringに挿入します。return値は、意味をもちません。

リングが一杯の場合、この関数は挿入される要素のための空きを作るために、1番新しい要素を削除します。

リングサイズを超えることを気にしない場合、そのリングをFIFO(first-in-first-out: 先入れ先出し)のキューとして使用することができます。たとえば:

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