ハッシュテーブルを作成する主な機能はmake-hash-tableです。
この関数は、指定された引数に基づいて新しいハッシュテーブルを作成します。引数は、キーワード(特別に認識される特定の記号)と、それに対応付けられた値を交互に並べた形式で指定する必要があります。
make-hash-tableにはいくつかのキーワードが当てはまりますが、本当に知っておくべきなのは:testと:weaknessの2つだけです。
:test testこのハッシュテーブルにおけるキー検索方法を指定します。デフォルトは eql で、eq や equal も代替案として利用可能です:
eql数値であるキーは、equal、すなわち値が等しく、かつ両者がともに整数であるか、またはともに浮動小数点数である場合に同一とみなされます。それ以外の場合、異なる2つのオブジェクトが同一となることはありません。
eq任意の2つの異なるLispオブジェクトは、キーとして異なる。
equal2つのLispオブジェクトは、equalに従って等しい場合、キーとして同一である。
define-hash-table-test(ハッシュ比較の定義を参照)を使用して、test
の追加の選択肢を定義できます。
:weakness weakハッシュテーブルの弱点とは、ハッシュテーブル内にキーや値が存在することで、それがガベージコレクションから保護されるかどうかという点にあります。
値 weak は、nil、key、value、key-or-value、key-and-value、または
key-and-value のエイリアスである t のいずれかである必要があります。weak が key
である場合、ハッシュテーブルはそのキーが(他で参照されていない限り)ガベージとして回収されるのを防ぎません。特定のキーが回収された場合、対応する関連付けがハッシュテーブルから削除されます。
weak が value
である場合、ハッシュテーブルは(他で参照されていない限り)値がガベージとして回収されるのを防ぐことはありません。特定の値が回収された場合、対応する関連付けがハッシュテーブルから削除されます。
weak が key-and-value または
t
である場合、関連付けを保持するには、キーと値の両方が生存している必要があります。したがって、ハッシュテーブルはキーと値のいずれもガベージコレクションから保護しません。いずれか一方がガベージとして回収されると、その関連付けは失われます。
weak が key-or-value
である場合、キーまたは値のいずれかが関連付けを保持できます。したがって、キーと値の両方がガベージとして回収される場合(弱ハッシュテーブルからの参照がない限り)、関連付けはハッシュテーブルから削除されます。
weak のデフォルト値は nil
であるため、ハッシュテーブルで参照されるすべてのキーと値はガベージコレクションから保護されます。
:size sizeこれは、ハッシュテーブルに格納する予定の関連付けの数に関するヒントを指定するものです。おおよその数が分かっている場合は、このように指定することで効率を多少向上させることができますが、ハッシュテーブルのメモリは自動管理されるため、速度向上が顕著に現れることは稀です。
また、ハッシュテーブルの印刷表現を用いてハッシュテーブルを作成することもできます。Lispリーダーは、指定されたハッシュテーブルの各要素が有効な読み込み構文を持っている限り、この印刷表現を読み取ることができます(印刷表現と読み込み構文を参照)。例えば、以下はキー key1 と key2(ともにシンボル)を、それぞれ
val1(シンボル)および 300(数値)に関連付けたハッシュテーブルを指定しています。
#s(hash-table data (key1 val1 key2 300))
ただし、Emacs
Lispのコードでこれを使用する場合、新しいハッシュテーブルが作成されるかどうかは未定義であることに注意してください。新しいハッシュテーブルを作成したい場合は、常に
make-hash-table を使用してください(自己評価フォームを参照)。
ハッシュテーブルの印刷表現は、‘#s’に続き、‘hash-table’で始まるリストで構成されます。リストの残りの部分は、ハッシュテーブルのプロパティと初期内容を指定する0個以上のプロパティ・値ペアで構成される必要があります。プロパティと値はリテラルとして読み込まれます。有効なプロパティ名はtest、weakness、およびdataです。dataプロパティは初期内容を表すキー・値ペアのリストである必要があり、その他のプロパティは、前述の対応するmake-hash-tableキーワード(:testおよび:weakness)と同じ意味を持ちます。
なお、バッファやフレームなど、読み取り構文を持たないオブジェクトを初期内容に含むハッシュテーブルを指定することはできません。こうしたオブジェクトは、ハッシュテーブルの作成後に追加することが可能です。