srfi.228
- 比較器の合成 ¶このモジュールは、典型的な集合型のために比較器を合成するいくつかのユーティリティを
提供します。比較器については
基本的な比較器とsrfi.114
- 比較器を参照してください。
[SRFI-228]{srfi.228
}
何らかの要素をくるむオブジェクトのための比較器を作ります。
作られた比較器は、type-testで適合性を調べ、適合するなら
unwrapをオブジェクトに適用して、得られた結果について
contents-comparator
を使って比較します。
例えば、文字列をboxに入れたものを扱うとしましょう。
そういうオブジェクトのための比較器strbox-comparator
は、次のとおり定義できます。
(define (strbox? obj) (and (box? obj) (string? (unbox obj)))) (define strbox-comparator (make-wrapper-comparator strbox? unbox string-comparator))
こう定義しておけば、boxに入った文字列を<?
等で比較したり、
ハッシュテーブルやツリーマップに格納したりすることができます。
[SRFI-228]{srfi.228
}
与えられた比較器が扱う型に共通する型のための比較器を作ります。
make-wrapper-comparator
と合わせると、直積型の比較器を簡単に作れます。
作られる比較器の型検査述語は、与えられたcomparatorの型検査述語全てを満たす時に 満たされるものです。
作られる比較器の等価判定述語は、全てのcomparatorの等価判定を満たす時に 満たされます。
順序判定述語は、comparator全てが順序判定述語を持つ場合に限り定義され、 次のとおり動作します。二つのオブジェクトは、comparatorの左から順に、 その順序判定述語に渡されます。最初のcomparatorの順序判定述語が真を返したら 全体の順序判定述語は直ちに真を返します。そうでなければ、最初のcomparatorの 等価判定述語が呼ばれ、それが偽を返したら全体の順序判定述語は直ちに偽を返します。 最初のcomparatorの等価判定述語が真であれば、次のcomparatorに進み、 同様に繰り返します。次のcomparatorが無くなれば偽が返されます。
ハッシュ関数はcomparator全てがハッシュ関数を持つ場合に限り定義されます。 それぞれのcomparatorのハッシュ関数がオブジェクトに対して呼ばれ、 そのハッシュ値を組み合わせたものが全体のハッシュ値となります。
次の例は、レコード型の比較器を、フィールドの比較器から合成します。
(define-record-type <member> make-member member? (name member-name) ; string (age member-age)) ; integer (define member-comparator (make-product-comparator (make-wrapper-comparator member? member-name string-comparator) (make-wrapper-comparator member? member-age integer-comparator)))
[SRFI-228]{srfi.228
}
与えられた比較器が扱う型の直和型を扱える比較器を作ります。
返される型検査述語は、与えられたオブジェクトがcomparator …の 型検査述語のいすれかを満たせば真を返します。 最初に型検査述語が満たされた比較器を「妥当な比較器」と呼びます。
等価判定述語は、二つの引数の妥当な比較器が等しく、 その比較器の等価判定述語が真を返した場合にのみ真となります。
順序判定述語は次のとおり動作します。 まず、各引数の妥当な比較器が選ばれます。最初の引数の妥当な比較器が 二番目の引数の妥当な比較器より左にあれば、順序判定述語は満たされます (つまり最初の引数の方が「小さい」とみなされます)。 最初の引数の妥当な比較器が二番目のそれより右にあれば、順序判定述語は満たされません。 二つの引数の妥当な比較器が等しければ、その順序判定述語の結果がそのまま返されます。
ハッシュ関数は、引数の妥当な比較器のハッシュ関数をそのまま使います。
[SRFI-228]{srfi.228
}
これは直積型の比較器の単位元として動作する比較器です。
いかなるオブジェクトも許容し、全てのオブジェクトを等価とみなします。
つまり、その型検査述語と等価判定述語は常に#t
を返します。
順序判定述語は常に#f
を返し、ハッシュ関数は常に0を返します。
[SRFI-228]{srfi.228
}
これは直和型の比較器の単位元として動作する比較器です。
この比較器が対象とする定義域は空集合です。すなわち、型検査述語は常に#f
を返します。
等価判定述語、順序判定述語、およびハッシュ関数はエラーを投げます。