data.imap
- 変更不可なマップ ¶このモジュールは、O(log n)でアクセスと更新が可能な、変更不可のデータ構造を 提供します(ここでの「更新」とは、要求された変更を取り込んだ新たな構造を 作って返すことです)。 現在の実装は関数的な赤黒木に基づいています。
リストや連想リストは、スタック風の変更不可なデータ構造として使えます。
つまり既存のデータ構造自体に変更を加えることなく、その先頭に要素を追加したり、
先頭から要素を取り除いたりできるということです。一方で、リストや連想リストは
任意の要素にアクセスするにはO(n)の時間を必要としますが、もっと速いアクセスが必要な
場合もあります。<imap>
オブジェクトはO(log n)のアクセスを可能にします。
そのかわり、要素の追加や削除にもO(log n)を必要とします。
{data.imap
}
<imap>
のメタクラスです。
{data.imap
}
変更不可なマップのクラスです。<imap-meta>
をメタクラスとします。
<ordered-dictionary>
を継承し、変更操作を除くディクショナリプロトコル
を実装します(gauche.dictionary
- ディクショナリフレームワーク参照)。
シーケンスとしてアクセスした場合は、キーと値のペアをキーの昇順に取り出すことができます。
{data.imap
}
空の変更不可なマップを新たに作って返します。
引数無しの場合は、キーの比較にはdefault-comparator
が使われます。
キーの比較方法を指定したい場合は、比較手続きを持つ比較器comparatorを
引数に渡してください。比較器については基本的な比較器を参照。
3番目の呼び出し形式は、キーの等価性を調べる述語key=?と
大小比較の述語key<?から比較器を作ります。どちらの述語も
ふたつの引数をとらなければなりません。このインタフェースは
tree-map
との一貫性のためにサポートされています (ツリーマップ参照)。
{data.imap
}
連想リストalistで指定されるキーと値の組み合わせを持つ変更不可なマップを新たに作って返します。
これはmake-imap
で空のimapを作ってからimap-put
で一要素づつ値を追加するよりも効率的です。
comparator引数はキーの比較に使うので比較手続きを持っていなければなりません。
省略された場合はdefault-comparator
が使われます。
比較器について詳しくは基本的な比較器を参照してください。
三つ目の形式は、等価判定述語key=?と比較述語key<?の組み合わせで キーの比較方法を指定するものです。どちらの述語も二つのキーを取ります。
(define m (alist->imap '((a . 1) (b . 2)))) (imap-get m 'a) ⇒ 1 (imap-get m 'b) ⇒ 2
{data.imap
}
tree-mapと同じ内容、同じ比較器を持つ変更不可なマップを返します。
{data.imap
}
objが変更不可なマップなら#t
を、そうでなければ#f
を返します。
{data.imap
}
変更不可なマップimmapが空なら#t
を、そうでなければ#f
を返します。
{data.imap
}
変更不可なマップimmapがキーkeyを持っていれば#t
を、
そうでなければ#f
を返します。
{data.imap
}
変更不可なマップimmap中のキーkeyに対応する値を返します。
immapがkeyを持っていない場合、default引数が与えられていれば
その値を返し、なければエラーが投げられます。
{data.imap
}
変更不可なマップimmapに、キーkeyと値valの対応を付け加えた
(あるいは、既に対応があった場合は置き換えた)新たな変更不可なマップを作って返します。
この操作はO(log n)です。
(define m1 (alist->imap '((a . 1) (b . 2)))) (define m2 (imap-put m1 'a 3)) (imap-get m2 'a) ⇒ 3 (imap-get m1 'a) ⇒ 1 ; not affected
{data.imap
}
変更不可なマップimmapから、キーkeyに対応するエントリを
取り除いた新たな変更不可なマップを作って返します。
immapにkeyが含まれていなかった場合、返されるマップは
元のマップと同じ内容を持ちます。
(define m1 (alist->imap '((a . 1) (b . 2)))) (define m2 (imap-delete m1 'a)) (imap-get m2 'a #f) ⇒ #f (imap-get m1 'a) ⇒ 1 ; not affected