Next: Hash Access, Up: Hash Tables [Contents][Index]
ハッシュテーブルを作成する基本的な関数はmake-hash-table
です。
この関数は指定された引数に対応する新しいハッシュテーブルを作成する。引数はキーワード(特別に認識される独自のシンボル)と、それに対応する値を交互に指定することで構成される。
make-hash-table
ではいくつかのキーワードが意味をもつが、実際に知る必要があるのは:test
と:weakness
の2つだけである。
:test test
これはそのハッシュテーブルにたいしてキーを照合する方法を指定する。デフォルトはeql
であり他の代替としてはeq
やequal
がある:
eql
キーが数字の場合、それらがequal
であれば、つまり、それらの値が等しく、どちらも整数、あるいはどちらも浮動少数の場合は“同一”です。それ以外では、2つの別々のオブジェクトは、決して“同一”になりません。
eq
2つの個別のLispオブジェクトはすべて、“別”のキーです。
equal
2つの個別のLispオブジェクトにたいして、それらがequal
の場合、“同一”のキーです。
testにたいして追加の選択肢を定義するために、define-hash-table-test
(Defining Hashを参照)を使用することができる。
:weakness weak
ハッシュテーブルのweakness(強度)は、ハッシュテーブル内に存在するキーと値をガーベージコレクションから保護するかどうかを指定する。
値weakにはnil
、key
、value
、key-or-value
、key-and-value
、またはt
(key-and-value
のエイリアス)のいずれかを指定しなければならない。weakがkey
ならそのハッシュテーブルは、(キーが他の場所で参照されていなければ)ハッシュテーブルのキーがガーベージコレクトされるのを妨げられない。ある特定のキーがガーベージコレクトされると、それに対応する連想はハッシュテーブルから削除される。
weakがvalue
ならそのハッシュテーブルは、(値が他の場所で参照されていなければ)ハッシュテーブルの値がガベージコレクトされるのを妨げませんられない。ある特定の値がガーベージコレクトされると、それに対応する連想はハッシュテーブルから削除される。
weakがkey-and-value
(かt
)なら、その連想を保護するためにはキーと値の両方が生きていなければならない。したがってそのハッシュテーブルは、キーと値の一方だけをガーベージコレクトから守ることはしない。キーか値のどちらか一方がガーベージコレクトされたら、その連想は削除される。
weakがkey-or-value
nara、キーか値のどちらか一方で、その連想を保護することができる。したがってキーと値の両方がガベージコレクトされたときだけ(それがハッシュテーブル自体にたいする参照でなければ)、ハッシュテーブルからその連想が削除される。
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です。
この関数はmake-hash-table
と同じですが、異なるスタイルの引数リストを指定します。引数testは、キーを照合する方法を指定します。
この関数は時代遅れです。かわりにmake-hash-table
を使用してください。
ハッシュテーブルのプリント表現を使用して、新しいハッシュテーブルを作成することもできます。指定されたハッシュテーブル内の各要素が、有効な入力構文(Printed Representationを参照)をもっていれば、Lispリーダーはこのプリント表現を読み取ることができます。たとえば以下は値val1
(シンボル)と300
(数字)に関連づけられた、キーkey1
とkey2
(両方ともシンボル)を、新しいハッシュテーブルに指定します。
#s(hash-table size 30 data (key1 val1 key2 300))
ハッシュテーブルのプリント表現は‘#s’と、その後の‘hash-table’で始まるリストにより構成されます。このリストの残りの部分はそのハッシュテーブルのプロパティーと初期内容を指定する、0個以上のプロパティーと値からなるペアで構成されるべきです。プロパティーと値はそのまま読み取られます。有効なプロパティー名はsize
、test
、weakness
、rehash-size
、rehash-threshold
、data
です。data
プロパティーは、初期内容にたいするキーと値のペアのリストであるべきです。他のプロパティーは、上記で説明したmake-hash-table
のキーワード(:size
、:test
など)と同じ意味をもちます。
バッファーやフレームのような、入力構文をもたないオブジェクトを含んだ初期内容をもつハッシュテーブルを指定できないことに注意してください。そのようなオブジェクトは、ハッシュテーブルを作成した後に追加します。