Gauche:HashTable
Shiro(2017/08/24 21:20:48 UTC): hash tableは仕様が乱立してて様子見だったんだけど、SRFI:125がR7RS largeに入ることになったんでどう合わせるか検討。ってことで0.9.5までのGaucheのAPIとの調整メモ。
方針
- 仕様がぶつかるものについては、Gauche組み込みの方でR7RS版インタフェースを -r というサフィックスをつけておく。
scheme.hash-table
でR7RSの名前でexport
(もともとGaucheに無かった手続きについても、引数順がGaucheの慣習と異なるものについては組み込みを -r サフィックスつきにする) - srfi-69互換インタフェースは組み込みとしては提供しない(deprecatedだし)。
scheme.hash-table
のみで対応。 - immutable hash tableはサポートしない。(hash-table-copyがimmutableを返さなければならないとなると既存のコードへの影響が大きすぎる)
srfi-125 API
deprecatedされてないもののみ。
- make-hash-table cmpr [arg ...]
Gaucheは
(make-hash-table [cmpr-or-symbol])
なので上位互換。
- hash-table cmpr [key value ...]
非互換。だけどこっちの仕様の方が使いやすいので、長期的には組み込みもこっちに合わせる。 とりあえずは次のとおり:
- 従来のGauche版: hash-table-from-pairs
- R7RS版: hash-table-r7として追加。
- hash-tableはhash-table-from-pairsの別名。将来切り替える。
- hash-table-unfold p f g seed cmpr arg ...
追加。
- alist->hash-table alist cmpr arg ...
Gaucheは
(alist->hash-table alist [cmpr])
なので上位互換。
- hash-table? obj
互換。
- hash-table-contains? ht obj
追加。(hash-table-exists?の別名)
- hash-table-empty? ht
互換。
- hash-table=? value-cmpr ht1 ht2
追加。
- hash-table-mutable? ht
要追加。
- hash-table-ref ht key [failure [success]]
hash-table-ref-r7として追加。
- hash-table-ref/default ht key default
追加。
- hash-table-set! ht arg ...
要追加。(hash-table-put!を拡張)
- hash-table-delete! ht key ...
keyを不定長にするのは簡単だが、Gauche組み込みと戻り値が違う (Gaucheはboolean、 srfi-125はinteger)なのでsrfi-125版はhash-table-delete!-r7として追加。
- hash-table-intern! ht key failure
hash-table-intern!-r7として追加。 failureにthunkを取るのがGaucheの慣習と異なるので、-r7サフィックスをつける。
- hash-table-update! ht key updater [failure [success]]
Gaucheのhash-table-update!とは、省略可能引数まで考えると非互換。 hash-table-update!-r7として追加。
- hash-table-pop! ht
Gaucheの
hash-table-pop!
とは非互換。 hash-table-pop!-r7として追加。
- hash-table-clear! ht
互換。
- hash-table-size ht
追加。
hash-table-num-entries
と同じ。
- hash-table-keys ht
互換。
- hash-table-values ht
互換。
- hash-table-entries ht
追加。
- hash-table-find proc ht failure
引数順がGaucheの慣習と異なるので、hash-table-find-r7として追加。
- hash-table-count pred ht
引数順がGaucheの慣習と異なるので、hash-table-count-r7として追加。
- hash-table-map proc cmpr ht
Gaucheのhash-table-mapとは非互換。 hash-table-map-r7として追加。
- hash-table-for-each proc ht
引数順がGaucheのhash-table-for-eachと異なるので、 hash-table-for-each-r7として追加。
- hash-table-map! proc ht
引数順がGaucheの慣習と異なるので、hash-table-map!-r7として追加。
- hash-table-map->list proc ht
引数順がGaucheの慣習と異なるので、hash-table-map->list-r7として追加。
- hash-table-fold proc seed hash-table
Gaucheのhash-table-foldとは引数順が異なる。 hash-table-fold-r7として追加。
- hash-table-prune! proc ht
引数順がGaucheの慣習と異なるので、hash-table-prune!-r7として追加。
- hash-table-copy ht [mutable?]
オプショナル引数を取るように拡張可。
- hash-table-empty-copy ht
追加。
- hash-table->alist ht
互換。
- hash-table-union! ht1 ht2
追加。
- hash-table-intersection! ht1 ht2
追加。
- hash-table-difference! ht1 ht2
追加。
- hash-table-xor! ht1 ht2
追加。