For Gauche 0.9.5


Next: , Previous: , Up: 組み込みライブラリ   [Contents][Index]

6.15 ハッシュテーブル

Gaucheの組み込みハッシュテーブルAPIはGauche特有のものです。 ポータブルなプログラムを書く場合は、今のところsrfi-69が使えます (基本的なハッシュテーブル参照)。

R7RS-largeの一部になる、新たなハッシュテーブルのSRFIが出たら、 Gaucheもそれに合わせる予定です。

Builtin Class: <hash-table>

ハッシュテーブルのクラスです。<collection><dictionary>を 継承します。

Function: make-hash-table :optional comparator

ハッシュテーブルを作成します。省略可能なcomparator引数には、 比較器 (基本的な比較器参照)もしくは、シンボル eq?eqv?equal?string=?のいずれかを 指定します。シンボルの場合はそれぞれ eq-comparatoreqv-comparatorequal-comparatorstring-comparatorが使われます。

比較器はハッシュ関数を持っていなければなりません。組み込みのハッシュ関数については ハッシュを参照してください。比較器を組み合わせて作られた比較器については、 元の比較器がハッシュ関数を持っていれば、通常は適切なハッシュ関数が設定されます。

comparatorが省略された場合はeq-comparatorが使われます。

Function: hash-table? obj

objがハッシュテーブルであれば#tを返します。

Function: hash-table-comparator ht

ハッシュテーブルhtで使われている比較器を返します。

Function: hash-table-type ht

これは古いAPIで、hash-table-comparatorによって置き換えられます。

ハッシュテーブルhtのタイプに応じて、シンボル eq?eqv?equal?string=?generalのいずれかを返します。

Function: hash-table-num-entries ht

ハッシュテーブルht中の要素の個数を返します。

Function: hash-table comparator key&value …

与えられたキーと値の列からハッシュテーブルを構築して 返します。comparator引数の意味はmake-hash-tableと同じです。 各key&valueはペアでなければならず、そのcarがキー、cdrが値として使われます。

(hash-table 'eq? '(a . 1) '(b . 2))
  ≡
  (rlet1 h (make-hash-table 'eq?)
     (hash-table-put! h 'a 1)
     (hash-table-put! h 'b 2))
Function: hash-table-copy ht

ハッシュテーブルhtのコピーを作って返します。

Function: hash-table-get ht key :optional default

キーkeyをハッシュテーブルhtから探します。見つかればキーに対応する 値を返します。キーが見つからなかった場合、defaultが与えられていればそれを 返し、そうでなければエラーを報告します。

Function: hash-table-put! ht key value

キーkeyと対応する値valueをハッシュテーブルhtに挿入します。

Method: ref (ht <hash-table>) key :optional default
Method: (setter ref) (ht <hash-table>) key value

hash-table-gethash-table-put!のメソッド版です。

Function: hash-table-exists? ht key

ハッシュテーブルhtにキーkeyを持つエントリがあれば#tを返します。

Function: hash-table-delete! ht key

ハッシュテーブルhtからキーkeyを持つエントリを削除します。 keyを持つエントリが実際に存在して削除された場合は#tを、 エントリが存在しなかった場合は#fを返します。 この手続きはSTkでhash-table-remove!と呼ばれているものです (STkのは戻り値が定義されていませんが)。GaucheではSRFI-1, SRFI-13やその他の ライブラリとの一貫性のために ‘delete’ を採用しました。

Function: hash-table-clear! ht

ハッシュテーブルhtの全てのエントリを削除します。

Function: hash-table-push! ht key value

ハッシュテーブルht中の、キーkeyに対応する値にvalueをコンスし、 それをkeyに対する新たな値とします。もしkeyに対応する値がまだ無ければ、 新たなエントリが作成され、(list value)がその値となります。

この手続きは次のコードと同じ動作をしますが、キーの探索が一度しか行われないためより高速です。

(hash-table-put! ht key
    (cons value (hash-table-get ht key '())))
Function: hash-table-pop! ht key :optional default

ハッシュテーブルht中のキーkeyに対応する値が存在し、かつペアで あった場合に、そのエントリーを元の値のcdrで置き換え、元の値のcarを返します。 keyに対応する値が存在しないかペアではなかった場合、テーブルは変更されず、 defaultが与えられていればそれが返され、与えられていなければエラーが報告されます。

値が置き換えれる場合でもキーの探索は一度しか行われないため効率が良いです。

Function: hash-table-update! ht key proc :optional default

hash-table-push!等のより一般的なバージョンです。 ハッシュテーブルの探索が一度しか行われないことを除いては、 基本的に次のように動作します。

(let ((tmp (proc (hash-table-get ht key default))))
  (hash-table-put! ht key tmp)
  tmp)

例えば、ハッシュテーブルを使ってオブジェクトの個数を数えているとしましょう。 次の1行で、オブジェクトitemが既に出現したかどうかを気にせずに その個数をインクリメントできます。

(hash-table-update! ht item (cut + 1 <>) 0))
Function: hash-table-for-each ht proc
Function: hash-table-map ht proc

ハッシュテーブルht内の全てのエントリについて、各エントリのキーと値を 2つの引数として手続きprocを呼びます。

Function: hash-table-fold ht kons knil

ハッシュテーブルht内の全てのエントリについてkonsを呼びます。 konsには3つの引数が渡されます。 各エントリのキーと値、および一つ前のkonsの返り値です。 最初のkonsの呼び出しの時には、第3引数にknilが渡されます。 最後のkonsの返り値がhash-table-foldの返り値となります。

Function: hash-table-keys ht
Function: hash-table-values ht

それぞれ、ハッシュテーブルht内の全てのキーまたは値をリストにして返します。

Function: alist->hash-table alist :optional comparator

alistに含まれるそれぞれの要素をエントリとして持つハッシュテーブルを 作成して返します。その時、要素のcarがキーとして、要素のcdrが値として 使われます。comparator引数の意味はmake-hash-tableと同じです。 comparatorのデフォルト値はeq-comparatorです。

Function: hash-table->alist hash-table
  (hash-table-map h cons)

Next: , Previous: , Up: 組み込みライブラリ   [Contents][Index]