[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.13 ハッシュテーブル

Builtin Class: <hash-table>

ハッシュテーブルのクラスです。<collection><dictionary>を 継承します。

Function: make-hash-table &optional type

ハッシュテーブルを作成します。シンボルtypeはテーブルのタイプを指定します。 現在、以下のようなタイプがサポートされています。 (typeが省略された場合はeq?とみなされます。)

eq?

キーの比較にeq?を使います。

eqv?

キーの比較にeqv?を使います。

equal?

キーの比較にequal?を使います。

string=?

キーの比較にstring=?を使います。キーは文字列でなければなりません。

eq?eqv?string=?タイプのハッシュテーブルでは、 システム組み込みのハッシュ関数が使われます。Schemeからは、 それらのハッシュ関数はそれぞれeq-hasheqv-hash、 そしてSRFI-13のstring-hashとして呼ぶことができます。 これらの関数はユーザ定義型に対応するように拡張することはできません。 一方、equal?タイプのハッシュテーブルは 下に述べるhash関数を使います。後者では、ユーザ定義型に対するハッシュ関数を 独自に定義することができます。

Function: hash obj

obj のハッシュ値を返します。equal?-タイプのハッシュテーブルで 利用するハッシュ関数です。この関数が返すハッシュ値は正確な非負整数で、 以下の二つの性質があります。

obj が、数値、真理値、文字、シンボル、キーワード、文字列、リスト、 ベクタのいずれかならば、そのハッシュ値を求めるのには内部ハッシュ関数を 使います。 obj が、それ以外であれば、 hash は総称関数 object-hash を呼んで、そのハッシュ値を計算します。

Generic Function: object-hash obj

この総称関数に対するメソッドを定義することにより、ユーザ定義された 型のオブジェクトはハッシュ値を持つことができ、equal?型のハッシュ テーブルで利用することができるようになります。

メソッドは正確な非負整数を返さなければなりません。また、hash と 同じ制約に従わなければなりません。

メソッドが obj の要素のハッシュ値を必要とする場合には、 それらに対しては、object-hash ではなく、hash を 呼ばなければなりません。プリミティブなオブジェクトのハッシュ計算は hash が行うからです。

 
(define-class <myclass> () (x y))

;; user-defined equality function
(define-method object-equal? ((a <myclass>) (b <myclass>))
  (and (equal? (ref a 'x) (ref b 'x))
       (eq?    (ref a 'y) (ref b 'y))))

;; user-defined hash function
(define-method object-hash ((a <myclass>))
  (hash (list (ref a 'x) (ref a 'y))))
Function: eq-hash obj
Function: eqv-hash obj

この2つは eq?-タイプおよび eqv?-タイプのハッシュテーブル 用のハッシュ関数で、2^n-1 以下の非負の整数を返します。ここで、 n は 32 以上のシステム依存の値です。返り値のハッシュ値は、 システムおよびプロセスに依存する値です。動作しているプロセスの境界を 超えてもちまわることはできません。

注意: eq-hash をつかって、数をハッシュしてはいけません。 2つの数はたとえその値が等しくても eq? であることは保証されて いません。したがって、eq?-タイプのハッシュテーブルで、 数のキーとしての使用はサポートされていません。

Function: hash-table? obj

objがハッシュテーブルであれば#tを返します。

Function: hash-table-type ht

ハッシュテーブルhtのタイプに応じて、シンボル eq?eqv?equal?string=?のいずれかを 返します。

Function: hash-table-num-entries ht

ハッシュテーブルht中の要素の個数を返します。

Function: hash-table type key&value …

与えられたキーと値の列からタイプがtypeであるハッシュテーブルを構築して 返します。typeの意味はmake-hash-tableと同じです。 各key&valueはペアでなければならず、そのcarがキー、cdrが値として使われます。

 
(hash-table 'eq? '(a . 1) '(b . 2))
  ≡
  (let ((h (make-hash-table 'eq?)))
     (hash-table-put! h 'a 1)
     (hash-table-put! h 'b 2)
     h)
Function: hash-table-get ht key &optional default

キーkeyをハッシュテーブルhtから探します。見つかればキーに対応する 値を返します。キーが見つからなかった場合、defaultが与えられていればそれを 返し、そうでなければエラーを報告します。

Function: hash-table-put! ht key value

キーkeyと対応する値valueをハッシュテーブルhtに挿入します。

Method: ref (ht <hash-table>) key &optional default
Method: (setter ref) (ht <hash-table>) key value

hash-table-gethash-table-put!のメソッド版です。

Function: hash-table-exists? ht key

ハッシュテーブルhtにキーkeyを持つエントリがあれば#tを返します。

Function: hash-table-delete! ht key

ハッシュテーブルhtからキーkeyを持つエントリを削除します。 keyを持つエントリが実際に存在して削除された場合は#tを、 エントリが存在しなかった場合は#fを返します。 この手続きはSTkでhash-table-remove!と呼ばれているものです (STkのは戻り値が定義されていませんが)。GaucheではSRFI-1, SRFI-13やその他の ライブラリとの一貫性のために `delete' を採用しました。

Function: hash-table-clear! ht

ハッシュテーブルhtの全てのエントリを削除します。

Function: hash-table-push! ht key value

ハッシュテーブルht中の、キーkeyに対応する値にvalueをコンスし、 それをkeyに対する新たな値とします。もしkeyに対応する値がまだ無ければ、 新たなエントリが作成され、(list value)がその値となります。

この手続きは次のコードと同じ動作をしますが、キーの探索が一度しか行われないためより高速です。

 
(hash-table-put! ht key
    (cons value (hash-table-get ht key '())))
Function: hash-table-pop! ht key &optional default

ハッシュテーブルht中のキーkeyに対応する値が存在し、かつペアで あった場合に、そのエントリーを元の値のcdrで置き換え、元の値のcarを返します。 keyに対応する値が存在しないかペアではなかった場合、テーブルは変更されず、 defaultが与えられていればそれが返され、与えられていなければエラーが報告されます。

値が置き換えれる場合でもキーの探索は一度しか行われないため効率が良いです。

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

hash-table-push!等のより一般的なバージョンです。 ハッシュテーブルの探索が一度しか行われないことを除いては、 基本的に次のように動作します。

 
(let ((tmp (proc (hash-table-get ht key default))))
  (hash-table-put! ht key tmp)
  tmp)

例えば、ハッシュテーブルを使ってオブジェクトの個数を数えているとしましょう。 次の1行で、オブジェクトitemが既に出現したかどうかを気にせずに その個数をインクリメントできます。

 
(hash-table-update! ht item (cut + 1 <>) 0))
Function: hash-table-for-each ht proc
Function: hash-table-map ht proc

ハッシュテーブルht内の全てのエントリについて、各エントリのキーと値を 2つの引数として手続きprocを呼びます。

Function: hash-table-fold ht kons knil

ハッシュテーブルht内の全てのエントリについてkonsを呼びます。 konsには3つの引数が渡されます。 各エントリのキーと値、および一つ前のkonsの返り値です。 最初のkonsの呼び出しの時には、第3引数にknilが渡されます。 最後のkonsの返り値がhash-table-foldの返り値となります。

Function: hash-table-keys ht
Function: hash-table-values ht

それぞれ、ハッシュテーブルht内の全てのキーまたは値をリストにして返します。

util.list - その他のリストライブラリも参照して下さい。 hash-table->alistalist->hash-tableが定義されています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.