Next: , Up: Hash Tables   [Contents][Index]


7.1 Creating Hash Tables

ハッシュテーブルを作成する基本的な関数は、make-hash-tableです。

Function: make-hash-table &rest keyword-args

この関数は、指定された引数に対応する、新しいハッシュテーブルを作成します。引数は、キーワード(特別に認識される独自のシンボル)と、それに対応する値を交互に指定することにより構成されます。

make-hash-tableでは、いくつかのキーワードが意味をもちますが、実際に知る必要があるのは、:test:weaknessの2つだけです。

:test test

これは、このハッシュテーブルにたいしてキーを照合する方法を指定します。デフォルトはeqlであり、他の代替としてはeqequalがあります:

eql

キーが数字の場合、それらがequalであれば、つまり、それらの値が等しく、どちらも整数、あるいはどちらも浮動少数の場合は“同一”です。それ以外では、2つの別々のオブジェクトは、決して“同一”になりません。

eq

2つの個別のLispオブジェクトはすべて、“別”のキーです。

equal

2つの個別のLispオブジェクトにたいして、それらがequalの場合、“同一”のキーです。

testにたいして追加の選択肢を定義するために、define-hash-table-test (Defining Hashを参照してください)を使用することができます。

:weakness weak

ハッシュテーブルのweakness(強度)は、ハッシュテーブル内に存在するキーと値を、ガーベージコレクションから保護するかどうかを指定します。

weakは、nilkeyvaluekey-or-valuekey-and-value、またはt(key-and-valueのエイリアス)のうちの1つを指定しなければなりません。weakkeyの場合、そのハッシュテーブルは、(キーが他の場所で参照されていなければ)ハッシュテーブルのキーがガーベージコレクトされるのを妨げません。ある特定のキーがガーベージコレクトされた場合、それに対応する連想は、ハッシュテーブルから削除されます。

weakvalueの場合、そのハッシュテーブルは、(値が他の場所で参照されていなければ)ハッシュテーブルの値がガベージコレクトされるのを妨げません。あるP特定の値がガーベージコレクトされた場合、それに対応する連想は、ハッシュテーブルから削除されます。

weakkey-and-value(またはt)の場合、その連想を保護するために、キーと値の両方が生きていなければなりません。したがって、そのハッシュテーブルは、キーと値のどちらかをガーベージコレクトから守ることはしません。キーか値のどちらか一方がガーベージコレクトされたら、その連想は削除されます。

weakkey-or-valueの場合、キーか値のどちらか一方で、その連想を保護することができます。したがって、キーと値の両方がガベージコレクトされたときだけ(それがハッシュテーブル自体にたいする参照でなければ)、ハッシュテーブルからその連想が削除されます。

weakにたいするデフォルトはnilなので、ハッシュテーブルから参照されているキーと値のすべては、ガーベージコレクションから保護されます。

:size size

これは、そのハッシュテーブルに連想を保管しようと計画している、連想の数にたいするヒントを指定します。数が概算で判っている場合、この方法でそれを指定することにより、処理を少し効率的にすることができます。小さすぎるサイズを指定した場合、そのハッシュテーブルは必要に応じて自動的に拡張子マスが、これを行なうには時間が余計にかかります。

デフォルトのサイズは65です。

:rehash-size rehash-size

ハッシュテーブルに連想を追加するとき、そのテーブルが“一杯(full)”の場合、テーブルは自動的に拡張します。この値は、そのときどれだけハッシュテーブルを拡張するかを指定します。

rehash-sizeが整数の場合(それは正であるべきです)、通常のサイズにrehash-sizeを加えることにより、ハッシュテーブルが拡張されます。rehash-sizeが浮動小数の場合(1より大きい方がよい)は、古いサイズにその数を乗じることにより、ガッシュテーブルが拡張されます。

デフォルト値は1.5です。

:rehash-threshold threshold

これは、ハッシュテーブルが“一杯(full)”(なのでもっと大きく拡張する必要がある)だと判断される基準を指定します。thresholdの値は、1以下の、正の浮動小数点数であるべきです。実際のエントリー数が、通常のサイズにたいする指定した割合を超えた場合、そのハッシュテーブルは“一杯”になります。thresholdのデフォルトは、0.8です。

Function: makehash &optional test

この関数はmake-hash-tableと同じですが、異なるスタイルの引数リストを指定します。引数testは、キーを照合する方法を指定します。

この関数は時代遅れです。かわりにmake-hash-tableを使用してください。

ハッシュテーブルのプリント表現を使用して、新しいハッシュテーブルを作成することもできます。指定されたハッシュテーブル内の各要素が、有効な入力構文(Printed Representationを参照してください)をもっていれば、Lispリーダーをこのプリント表現を読み取ることができます。たとえば以下は、値val1(シンボル)と300(数字)に関連づけられた、キーkey1key2(両方ともシンボル)を、新しいハッシュテーブルを指定します。

#s(hash-table size 30 data (key1 val1 key2 300))

ハッシュテーブルのプリント表現は、‘#s’と、その後の‘hash-table’で始まるリストにより構成されます。このリストの残りの部分は、そのハッシュテーブルのプロパティーと初期内容を指定する、0個以上のプロパティーと値のペアで構成されるべきです。プロパティーと値は、そのまま読み取られます。有効なプロパティー名は、sizetestweaknessrehash-sizerehash-threshold、およびdataです。dataプロパティーは、初期ないようにたいするキーと値のペアのリストであるべきです。他のプロパティーは、上記で説明したmake-hash-tableのキーワード(:size:testなど)と同じ意味をもちます。

バッファーやフレームのような、入力構文をもたないオブジェクトを含む初期内容をもつハッシュテーブルを指定できないことに注意してください。そのようなオブジェクトは、ハッシュテーブルが作成された後に追加します。