Common Lispのハッシュテーブルは、連想データを格納するためのデータ構造です。 キー(任意のオブジェクト)を値(任意のオブジェクト)に対応付けます。
ハッシュテーブルはmake-hash-table関数で作成できます。
make-hash-table関数は、ハッシュテーブルの初期サイズやリサイズのしきい値を細かく調整するためのキーワード引数をいくつか受け取ります。それらの詳しい情報はドキュメントを参照してください。
さらに重要なのは、キーと値の挿入・検索・削除の際にキーをどのように比較するかを定義するtestキーワード引数も受け取る点です。
test引数の値は'eq、'eql、'equal、'equalpのいずれかで、それぞれ汎用の等価述語に対応します。
デフォルト値は'eqlです。
キーから値を取得するにはgethashを使います。
gethashは[オプション引数][concept-defualt-arguments]を取ることができ、これはキーがハッシュテーブルに存在しない場合に返される値として機能します。
gethashは複数の値も返します(別のコンセプトで説明します)。
1つ目の値は、ハッシュテーブルにおけるそのキーの値、デフォルト値が指定されていればそのデフォルト値、どちらでもなければNILです。
2つ目の値は、そのキーがハッシュテーブルに存在したかどうかを示す真偽値です。
キーと値のペアを挿入するには、setfをgethashと組み合わせて使います。
キーとその値を削除するにはremhashを使います。
すべてのキーと値を削除するにはclrhashを使います。
Common Lispのハッシュテーブルは、他の言語と同様、順序が保証されてはいませんが、キーと値のペアを1つずつ処理しながら反復処理すると便利なことがあります。
これはmaphashで行えます。
(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)
(これは各キーと値をconsペアとして1行に1つずつ出力します。)
(setf *hash-table* (make-hash-table)) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*) ; => NIL
; NIL
(gethash :foo *hash-table*
:default-value) ; => :DEFAULT-VALUE
; NIL
(setf (gethash :foo *hash-table*) :bar) ; => :BAR
(gethash :foo *hash-table*) ; => :BAR
; T
(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*) ; => :VALUE
; T
(remhash :key *hash-table*) ; => T
(gethash :key *hash-table*) ; => NIL
; => NIL
(clrhash *hash-table*) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*) ; => NIL
; NIL