Common Lispのハッシュテーブルは、関連するデータをまとめて保存しておくためのデータ構造です。 キー(どんなオブジェクトでもかまいません)を値(こちらもどんなオブジェクトでもかまいません)に対応付けます。 他の言語では、この概念をマップ、辞書、ハッシュなどと呼ぶことがあります。
ハッシュテーブルはmake-hash-table関数で作成できます。
(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>
(ハッシュテーブルが表示される形式は処理系によって異なるため、REPLでは違って見えるかもしれません。)
ハッシュテーブルからキーで値を取得するには、gethash関数を使います。
*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
; T
gethashは複数の値を返します。これについては別の概念で説明します。
ハッシュテーブルに値を挿入するには、gethashと組み合わせてsetfを次のように使います。
(setf (gethash :foo *hash-table*) :bar) : => :bar
これはハッシュテーブル*hash-table*にあるキー:fooの値を:barに変更します。
そしてその値を返します。
setfの使い方については、別の概念で説明します。
Lamontは、自分でビデオゲームを作りたいと思っているLispの宇宙人です。そのうちの1つとして、ハイスコアリストを管理するというタスクの手伝いを頼まれています。
引数を一切取らず、新しい空のハッシュテーブルに評価される関数make-high-score-tableを定義します。
(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
テーブルにプレイヤーを追加するには、次の2つの引数を取る関数add-playerを定義します。
プレイヤーの初期スコアは0に設定します。
(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0
プレイヤーのスコアを設定するには、次の3つの引数を取る関数set-scoreを定義します。
(set-score hash-table :louis 1234) ; => 1234
テーブルからプレイヤーのスコアを取得するには、次の2つの引数を取る関数get-scoreを定義します。
この関数は、そのプレイヤーに保存されているスコアに評価される必要があります。
そのプレイヤーのスコアが保存されていない場合、またはそのプレイヤーがまだテーブルに存在しない場合は、0に評価されます。
(get-score hash-table :louis) ; => 1234
(get-score hash-table :lilly) ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0
ハイスコアテーブルからプレイヤーを削除するには、次の2つの引数を取る関数remove-playerを定義します。
この関数は、プレイヤーがまだテーブルに追加されていない場合も問題なく処理する必要があります。 当然ながら、プレイヤーを削除したあとにテーブルからそのスコアを取得すると、0になります。
(set-score hash-table :louis 1234) ; => 1234
(remove-player hash-table :louis) ; => T
(get-score hash-table :louis) ; => 0
(remove-player hash-table :not-in-the-table) ; => NIL
Exercismに登録すれば、27個のコンセプト92個の演習、そして本物の人間によるメンタリングとともに、Common Lispを学んでマスターできます。すべて無料です。