srfi.69
- 基本的なハッシュテーブル ¶このモジュールはR7RSのscheme.hash-table
により更改されています。
(scheme.hash-table
- R7RSハッシュテーブル参照)。新たなコードはそちらを使うようにしてください。
このモジュールは、Gauche組み込みのハッシュテーブルのごく薄いラッパーです
(ハッシュテーブル参照)。このsrfiを要求するライブラリへの互換性のためだけに
提供されています。このモジュールのmake-hash-table
で作られるハッシュテーブルは
Gauche組み込みのハッシュテーブルそのものなので、どちらのAPIにも渡せます。
SRFI-69とGaucheのAPIの違いを挙げておきます:
make-hash-table
およびalist->hash-table
は、
Gaucheでは比較器を取りますが、SRFI-69では等価述語とハッシュ関数を取ります。
make-hash-table
に渡されるハッシュ関数は、
ハッシュ値を計算するオブジェクトに加え、ハッシュ値の範囲を指定する整数を取ります。
hash-table-ref
は、
キーが登録されていなかった場合のデフォルト値を得るために、サンクを取ります。
Gaucheのhash-table-ref
はデフォルト値そのものを取ります。
SRFI-69のhash-table-ref/default
が、Gaucheのhash-table-ref
に
相当します。(但しhash-table-ref/default
はデフォルト値を省略できません)。
hash-table-update!
とhash-table-update!/default
に対する
Gaucheのhash-table-update!
は、
hash-table-ref
とhash-table-ref/default
に対する
hash-table-get
の関係と同じです。
hash-table-for-each
に相当するイテレータはSRFI-69では
hash-table-walk
です。
srfiは既存の実装と名前がぶつからないようにこの名前を採用しました。
以下の手続きはGauche組み込みのものと同じです。 ハッシュテーブルを参照してください。
hash-table? hash-table-delete! hash-table-exists? hash-table-keys hash-table-values hash-table-fold hash-table->alist hash-table-copy
[SRFI-69]{srfi.69
}
新たなハッシュテーブルを作って返します。Gauche組み込みのものと同じ名前ですが、
引数が異なります。
eq-predは等価判定述語です。
二つの引数を取り、それらが等価であるとみなされる場合に#t
を返します。
省略された場合はequal?
が使われます。
hash-procはハッシュ関数です。ハッシュ値を計算したいオブジェクトと、
ハッシュ値の範囲を指定する正の整数の、二つの引数を取ります。
(Gaucheの組み込みのハッシュ関数は一つの引数しか取らないことに注意してください)。
省略された場合、Gaucheはeq-pred
が既知の関数
(eq?
、eqv?
、equal?
、string=?
、
string-ci=?
)であればそれにふさわしいハッシュ関数を提供し、
そうでなければscheme.hash-table
のhash
を使います
(scheme.hash-table
- R7RSハッシュテーブル参照)。
ただ、ジェネリックなhash
が常にふさわしいとは限りません。
eq-predを渡したなら、適切なhash-procも渡すべきです。
返されるハッシュテーブルはGaucheのネイティブハッシュテーブルです。 従ってそれをGaucheの組み込み関数に渡すこともできます。
SRFI-69はmake-hash-table
に実装依存の余分な引数args
を渡すことを許しています。今のところ、Gaucheは余分な引数は単に無視します。
[SRFI-69]{srfi.69
}
組み込みのalist->hash-table
と似てますが、
単一の比較器ではなく
eq-predとhash-fnを別々に取ります。
alist引数はペアのリストです。それぞれのペアの carがキー、cdrが対応する値になります。
eq-pred、hash-fn、およびargsについての詳細は
上のmake-hash-table
を参照してください。
[SRFI-69]{srfi.69
}
ハッシュテーブルhtの等価判定述語とハッシュ関数をそれぞれ返します。
SRFI-69のハッシュ関数は省略可能なbound引数を取ることになっています。
Gaucheのハッシュテーブルのハッシュ関数はbound引数を取らないので、
hash-table-hash-function
が返す関数はラッパーをかませて
省略可能なbound引数を取るようにしています。
[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))
[SRFI-69]{srfi.69
}
ハッシュテーブルhtからキーkeyに対応する値を探して返します。
キーが見つからなければdefaultが返されます。
組み込みのhash-table-get
と似ていますが、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
を取る点で異なっていることに注意してください(ハッシュテーブル参照)
[SRFI-69]{srfi.69
}
ハッシュテーブルht中のエントリの数を返します。
Gaucheのhash-table-num-entries
と同じです。
[SRFI-69]{srfi.69
}
ハッシュテーブルhtの各エントリにつき、
キーと値を引数としてprocを呼びます。
Gaucheのhash-table-for-each
と同じです。
[SRFI-69]{srfi.69
}
ht2の全てのエントリをht1に追加し、ht1を返します。
ht1は破壊的に変更されることに注意してください。
同じキーを持つエントリがht1とht2の両方にあった場合は、
ht2の値でht1のエントリが上書きされます。
[SRFI-69]{srfi.69
}
Gaucheのhash
と似ていますが、省略可能なbound引数を取ります。
bound引数は与えられるなら正の整数でなければならず、
返される値が0から(- bound 1)
(両端含む) までに制限されます。
[SRFI-69]{srfi.69
}
SRFI-13の同名の手続きと似ていますが、start/end引数は取りません
(srfi.13
- 文字列ライブラリ参照)。
[SRFI-69]{srfi.69
}
bound引数を取ること以外はGaucheのeq-hash
と同じです。