リングとは、挿入、削除、回転、および剰余インデックスによる参照と走査をサポートする固定サイズのデータ構造です。効率的なリングデータ構造は、ringパッケージによって実装されています。このパッケージでは、本節に挙げる関数が提供されています。
なお、Emacsのキルリングやマークリングといったいくつかのリングは、実際にはringパッケージを使用せず単純なリストとして実装されています。そのため、以下の関数はこれらには動作しません。
これにより、size個のオブジェクトを保持できる新しいリングが返されます。sizeは整数である必要があります。
object が環であれば t を、そうでなければ
nil を返します。
これにより、ringの最大容量が返されます。
これは、ring が現在保持しているオブジェクトの数を返します。この値は、ring-size が返す値を超えることはありません。
これにより、ring 内のオブジェクトが、新しい順にリストとして返されます。
これにより、ring のコピーである新しいリングが返されます。この新しいリングには、ring と同じ (eq) オブジェクトが含まれています。
これは、ring が空の場合は t
を、そうでない場合は nil を返します。
環における最新の元のインデックスは常に0である。より大きなインデックスは、より古い元に対応する。インデックスは環の長さを法として計算される。インデックス −1 は最も古い元に、−2 はその次に古い元に、というように対応する。
インデックス index で見つかった ring
内のオブジェクトを返します。index は負の値、またはリング長を超える値となる場合があります。ring が空の場合、ring-ref はエラーを示します。
これは ring に object を挿入してそれを最新の要素とし、object を返します。
リングが満杯の場合、挿入時に最も古い要素を削除して、新しい要素のための空きを作ります。
ringからオブジェクトを削除し、そのオブジェクトを返します。引数indexで削除する項目を指定し、nilの場合は最も古い項目を削除することを意味します。ringが空の場合、ring-removeはエラーを示します。
これは ring に object を挿入し、それを最古の要素として扱います。戻り値は重要ではありません。
リングが満杯の場合、この関数は挿入する要素のための空きを作るため、最新の要素を削除します。
ringのサイズをsizeに設定します。新しいサイズの方が小さい場合は、リング内の最も古いアイテムが破棄されます。
リングサイズを超えないよう注意すれば、そのリングを先入れ先出しの待ち行列として利用できます。例えば:
(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")