キーに対応する値を更新する


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

(import (rnrs base) (rnrs hashtables))

(hashtable-set! ht key (+ (hashtable-set! ht key 0) 1))

とすると key に対応する値(なければ 0)に 1 を足したものを新たに key に対応づけることができるが、これは key のハッシュ値を 2 度計算するので無駄である。

このような場合は hashtable-update! 手続きを使った方が効率がよい。

(import (rnrs base) (rnrs hashtables))

(hashtable-update! ht key 0 (lambda (x) (+ x 1)))

典型的な使用例としてはリスト中のオブジェクトの出現回数を調べるなどがある。

(import (rnrs base) (rnrs hashtables))

(define (count-occurences xs)
  (let ((ht (make-hashtable equal? equal-hash)))
    (for-each (lambda (x)
      (hashtable-update! ht x 0 (lambda (n) (+ n 1))))
      xs)
    ht))