For Development HEAD DRAFTSearch (procedure/syntax/module):

11.17 srfi.69 - 基本的なハッシュテーブル

Module: srfi.69

このモジュールはR7RSのscheme.hash-tableにより更改されています。 (scheme.hash-table - R7RSハッシュテーブル参照)。新たなコードはそちらを使うようにしてください。

このモジュールは、Gauche組み込みのハッシュテーブルのごく薄いラッパーです (ハッシュテーブル参照)。このsrfiを要求するライブラリへの互換性のためだけに 提供されています。このモジュールのmake-hash-tableで作られるハッシュテーブルは Gauche組み込みのハッシュテーブルそのものなので、どちらのAPIにも渡せます。

SRFI-69とGaucheのAPIの違いを挙げておきます:

以下の手続きはGauche組み込みのものと同じです。 ハッシュテーブルを参照してください。

hash-table?       hash-table-delete!   hash-table-exists?
hash-table-keys   hash-table-values    hash-table-fold
hash-table->alist hash-table-copy
Function: make-hash-table :optional eq-pred hash-proc :rest args

[SRFI-69]{srfi.69} 新たなハッシュテーブルを作って返します。Gauche組み込みのものと同じ名前ですが、 引数が異なります。

eq-predは等価判定述語です。 二つの引数を取り、それらが等価であるとみなされる場合に#tを返します。 省略された場合はequal?が使われます。

hash-procはハッシュ関数です。ハッシュ値を計算したいオブジェクトと、 ハッシュ値の範囲を指定する正の整数の、二つの引数を取ります。 (Gaucheの組み込みのハッシュ関数は一つの引数しか取らないことに注意してください)。 省略された場合、Gaucheはeq-predが既知の関数 (eq?eqv?equal?string=?string-ci=?)であればそれにふさわしいハッシュ関数を提供し、 そうでなければscheme.hash-tablehashを使います (scheme.hash-table - R7RSハッシュテーブル参照)。 ただ、ジェネリックなhashが常にふさわしいとは限りません。 eq-predを渡したなら、適切なhash-procも渡すべきです。

返されるハッシュテーブルはGaucheのネイティブハッシュテーブルです。 従ってそれをGaucheの組み込み関数に渡すこともできます。

SRFI-69はmake-hash-tableに実装依存の余分な引数args を渡すことを許しています。今のところ、Gaucheは余分な引数は単に無視します。

Function: alist->hash-table alist :optional eq-pred hash-fn :rest args

[SRFI-69]{srfi.69} 組み込みのalist->hash-tableと似てますが、 単一の比較器ではなく eq-predhash-fnを別々に取ります。

alist引数はペアのリストです。それぞれのペアの carがキー、cdrが対応する値になります。

eq-predhash-fn、およびargsについての詳細は 上のmake-hash-tableを参照してください。

Function: hash-table-equivalence-function ht
Function: hash-table-hash-function ht

[SRFI-69]{srfi.69} ハッシュテーブルhtの等価判定述語とハッシュ関数をそれぞれ返します。

SRFI-69のハッシュ関数は省略可能なbound引数を取ることになっています。 Gaucheのハッシュテーブルのハッシュ関数はbound引数を取らないので、 hash-table-hash-functionが返す関数はラッパーをかませて 省略可能なbound引数を取るようにしています。

Function: hash-table-ref ht key :optional thunk

[SRFI-69]{srfi.69} ハッシュテーブルhtからキーkeyを探し、対応する値を返します。 keyがテーブル中に無かった場合、thunkが引数なしで呼ばれ、 その結果が戻り値となります。 thunkの省略時の値はエラーを投げる手続きです。

このインタフェースGauche組み込みのhash-table-getと異なることに 注意してください。hash-table-getは省略可能なdefault引数を取り、 キーが見つからなかった場合はそれを返します(ハッシュテーブル参照)。 次の関係が成り立ちます。

(hash-table-get ht key default) ≡ (hash-table-ref ht key (^[] default))
Function: hash-table-ref/default ht key default

[SRFI-69]{srfi.69} ハッシュテーブルhtからキーkeyに対応する値を探して返します。 キーが見つからなければdefaultが返されます。 組み込みのhash-table-getと似ていますが、default は省略できません(ハッシュテーブル参照)。

Function: hash-table-set! ht key val

[SRFI-69]{srfi.69} Gaucheのhash-table-put!と同じです(ハッシュテーブル参照)。

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

[SRFI-69]{srfi.69} ht中のkeyに対応する値を引数としてprocを呼び出し、 ht中の値をprocの戻り値で置き換えます。 以下の機能的な等価性が成り立ちますが、これらの手続きの方が効率的かもしれません。

(hash-table-update! ht key proc thunk)
 ≡ (hash-table-set! ht key (proc (hash-table-ref ht key thunk)))

(hash-table-update!/default ht key proc default)
 ≡ (hash-table-set! ht key (proc (hash-table-ref/default ht key default)))

Gauche組み込みのhash-table-update!thunkではなくdefault を取る点で異なっていることに注意してください(ハッシュテーブル参照)

Function: hash-table-size ht

[SRFI-69]{srfi.69} ハッシュテーブルht中のエントリの数を返します。 Gaucheのhash-table-num-entriesと同じです。

Function: hash-table-walk ht proc

[SRFI-69]{srfi.69} ハッシュテーブルhtの各エントリにつき、 キーと値を引数としてprocを呼びます。 Gaucheのhash-table-for-eachと同じです。

Function: hash-table-merge! ht1 ht2

[SRFI-69]{srfi.69} ht2の全てのエントリをht1に追加し、ht1を返します。 ht1は破壊的に変更されることに注意してください。 同じキーを持つエントリがht1ht2の両方にあった場合は、 ht2の値でht1のエントリが上書きされます。

Function: hash obj :optional bound

[SRFI-69]{srfi.69} Gaucheのhashと似ていますが、省略可能なbound引数を取ります。 bound引数は与えられるなら正の整数でなければならず、 返される値が0から(- bound 1) (両端含む) までに制限されます。

Function: string-hash obj :optional bound
Function: string-ci-hash obj :optional bound

[SRFI-69]{srfi.69} SRFI-13の同名の手続きと似ていますが、start/end引数は取りません (srfi.13 - 文字列ライブラリ参照)。

Function: hash-by-identity obj :optional bound

[SRFI-69]{srfi.69} bound引数を取ること以外はGaucheのeq-hashと同じです。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT