[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ハッシュテーブルのクラスです。<collection>
と<dictionary>
を
継承します。
ハッシュテーブルを作成します。シンボルtypeはテーブルのタイプを指定します。
現在、以下のようなタイプがサポートされています。
(typeが省略された場合はeq?
とみなされます。)
eq?
キーの比較にeq?
を使います。
eqv?
キーの比較にeqv?
を使います。
equal?
キーの比較にequal?
を使います。
string=?
キーの比較にstring=?
を使います。キーは文字列でなければなりません。
eq?
、eqv?
、string=?
タイプのハッシュテーブルでは、
システム組み込みのハッシュ関数が使われます。Schemeからは、
それらのハッシュ関数はそれぞれeq-hash
、eqv-hash
、
そしてSRFI-13のstring-hash
として呼ぶことができます。
これらの関数はユーザ定義型に対応するように拡張することはできません。
一方、equal?
タイプのハッシュテーブルは
下に述べるhash
関数を使います。後者では、ユーザ定義型に対するハッシュ関数を
独自に定義することができます。
obj のハッシュ値を返します。equal?
-タイプのハッシュテーブルで
利用するハッシュ関数です。この関数が返すハッシュ値は正確な非負整数で、
以下の二つの性質があります。
hash
が定義されているとき、
あらゆるオブジェクト a および b に対して、
(equal? a b)
であれば
(= (hash a) (hash b))
。
hash
は(そのデータのアドレスというような)実行時の計算機の状態とは
独立しています。それゆえ、その値をファイルに格納し、別のプロセスで読み込んで
利用しても、ハッシュ値の正当性を失うことがないので、安全です。
obj が、数値、真理値、文字、シンボル、キーワード、文字列、リスト、
ベクタのいずれかならば、そのハッシュ値を求めるのには内部ハッシュ関数を
使います。
obj が、それ以外であれば、 hash
は総称関数 object-hash
を呼んで、そのハッシュ値を計算します。
この総称関数に対するメソッドを定義することにより、ユーザ定義された
型のオブジェクトはハッシュ値を持つことができ、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)))) |
この2つは eq?
-タイプおよび eqv?
-タイプのハッシュテーブル
用のハッシュ関数で、2^n-1 以下の非負の整数を返します。ここで、
n は 32 以上のシステム依存の値です。返り値のハッシュ値は、
システムおよびプロセスに依存する値です。動作しているプロセスの境界を
超えてもちまわることはできません。
注意: eq-hash
をつかって、数をハッシュしてはいけません。
2つの数はたとえその値が等しくても eq?
であることは保証されて
いません。したがって、eq?
-タイプのハッシュテーブルで、
数のキーとしての使用はサポートされていません。
objがハッシュテーブルであれば#t
を返します。
ハッシュテーブルhtのタイプに応じて、シンボル
eq?
、eqv?
、equal?
、string=?
のいずれかを
返します。
ハッシュテーブルht中の要素の個数を返します。
与えられたキーと値の列からタイプが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) |
キーkeyをハッシュテーブルhtから探します。見つかればキーに対応する 値を返します。キーが見つからなかった場合、defaultが与えられていればそれを 返し、そうでなければエラーを報告します。
キーkeyと対応する値valueをハッシュテーブルhtに挿入します。
hash-table-get
とhash-table-put!
のメソッド版です。
ハッシュテーブルhtにキーkeyを持つエントリがあれば#t
を返します。
ハッシュテーブルht
からキーkeyを持つエントリを削除します。
keyを持つエントリが実際に存在して削除された場合は#t
を、
エントリが存在しなかった場合は#f
を返します。
この手続きはSTkでhash-table-remove!
と呼ばれているものです
(STkのは戻り値が定義されていませんが)。GaucheではSRFI-1, SRFI-13やその他の
ライブラリとの一貫性のために `delete' を採用しました。
ハッシュテーブルhtの全てのエントリを削除します。
ハッシュテーブルht中の、キーkeyに対応する値にvalueをコンスし、
それをkeyに対する新たな値とします。もしkeyに対応する値がまだ無ければ、
新たなエントリが作成され、(list value)
がその値となります。
この手続きは次のコードと同じ動作をしますが、キーの探索が一度しか行われないためより高速です。
(hash-table-put! ht key (cons value (hash-table-get ht key '()))) |
ハッシュテーブルht中のキーkeyに対応する値が存在し、かつペアで あった場合に、そのエントリーを元の値のcdrで置き換え、元の値のcarを返します。 keyに対応する値が存在しないかペアではなかった場合、テーブルは変更されず、 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)) |
ハッシュテーブルht内の全てのエントリについて、各エントリのキーと値を 2つの引数として手続きprocを呼びます。
ハッシュテーブルht内の全てのエントリについてkonsを呼びます。
konsには3つの引数が渡されます。
各エントリのキーと値、および一つ前のkonsの返り値です。
最初のkonsの呼び出しの時には、第3引数にknilが渡されます。
最後のkonsの返り値がhash-table-fold
の返り値となります。
それぞれ、ハッシュテーブルht内の全てのキーまたは値をリストにして返します。
util.list
- その他のリストライブラリも参照して下さい。
hash-table->alist
とalist->hash-table
が定義されています。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.