星田さんの記事に対するコメント。
うん、これはだな。
次のようにする。
まぁ、画像を用意しなかったんでpicと言うシンボルにしたわけだけど。
まず、
- 破壊的変更を避けたければ、大域変数*item-table*をmake-hash単独で作るんじゃなく(それをやっちゃえばhash-set!で破壊的変更をせざるを得なくなる)、データ全体を作るようにしてしまう。
- make-hashは連想リストを受け取り、ハッシュテーブルに変換してくれる関数だ。
- 従って、make-hashの引数自体を連想リストにするように工夫すれば良い。
と言う事。
こうしておけば、
とhash-refがキチンと使える事が分かるだろう(※1)(※2)。
以上!
※1: ハッシュテーブルは検索性能を第一に考えてるので、要素の並びはグチャグチャ、つまり順不同になる事に気をつけよう。
順序が重要な場合は、ハッシュテーブルの使用は適さない(と言うか随時データ変換が必要になる場合がある)。
※2: 最初にやったのが上手く行かなかった理由は、生成したデータを良く見れば分かると思う。
これは「ハッシュテーブル」じゃなくって「ハッシュテーブルのリスト」になっている。
つまり、検索しようとしても大枠がリストだから弾かれる。
また、各要素が全部「独立した」ハッシュテーブルになってるんで、実はハッシュテーブルの用を成していない。各ハッシュテーブルが一つのキーと値を独自に持ってて、互いに関係がないから、だ。