ハッシュテーブルを作成する


Tags: ハッシュテーブル, R6RS

空のハッシュテーブルは make-hashtable 手続きで作成する。 make-hashtable 手続きには内容に応じて適当な同値手続きとハッシュ関数を渡す。

(import (rnrs))

(make-hashtable string=? string-hash)
(make-hashtablel equal? equal-hash)

特に、同値手続きに eq? や eqv? を使うハッシュテーブルの構築手続きは別に用意されている。

(import (rnrs))

(make-eq-hashtable)
(make-eqv-hashtable)

ハッシュテーブルに対応するリテラルはないため、特定の内容を持つハッシュテーブルは連想リストなどから変換することが多い。

(import (rnrs))

(define (alist->hashtable alis equiv hash-fun)
  (let ((ht (make-hashtable equiv hash-fun)))
    (for-each (lambda (p)
      (hashtable-set! ht (car p) (cdr p)))
      alis)
    ht))

(alist->hashtable
  '((a . Ancona) (b . Bologna) (c . Como) (d . Domodossola) (e . Empoli)
    (f . Firenze) (g . Genova) (h . hotel) (i . Imperia) (j . jersey)
    (k . kukrsaal) (l . Livorno) (m . Milano) (n . Napoli) (o . Otranto)
    (p . Padova) (q . Quarto) (r . Roma) (s . Savona) (t . Tranto) (u . Udine)
    (v . Venezia) (w . Washington) (x . xeres) (y . yacht) (z . Zara))
  eq? eq-hash)