Search

( make-comparator [ procedure? type-test ] [ procedure? equality ] [ #f / procedure? ordering ] [ #f / procedure? hash ] ) comparator?
type-test ( λ obj ) boolean?
equality ( λ obj1 obj2 ) boolean?
ordering ( λ obj1 obj2 ) boolean?
hash ( λ obj ) integer?
Returns a comparator which bundles the type-test, equality, ordering, and hash procedures provided. However, if ordering or hash is #f, a procedure is provided that signals an error on application. The predicates comparator-ordered? and/or comparator-hashable?, respectively, will return #f in these cases.
( make-comparator [ procedure? type-test ] [ procedure? equality ] [ #f / procedure? ordering ] [ #f / procedure? hash ] ) comparator?
type-test ( λ obj ) boolean?
equality ( λ obj1 obj2 ) boolean?
ordering ( λ obj1 obj2 ) boolean?
hash ( λ obj ) integer?
Returns a comparator which bundles the type-test, equality, ordering, and hash procedures provided. However, if ordering or hash is #f, a procedure is provided that signals an error on application. The predicates comparator-ordered? and/or comparator-hashable?, respectively, will return #f in these cases.
( make-default-comparator ) comparator?
Returns a comparator known as a default comparator that accepts Scheme values and orders them in some implementation-defined way, subject to the following conditions: 1 Given disjoint types a and b, one of three conditions must hold: 1.1 All objects of type a compare less than all objects of type b. 1.2 All objects of type a compare greater than all objects of type b. 1.3 All objects of both type a and type b compare equal to each other. This is not permitted for any of the Scheme types mentioned below. 2 The empty list must be ordered before all pairs. 3 When comparing booleans, it must use the total order #f < #t. 4 When comparing characters, it must use char=? and char<?. Note: In R5RS, this is an implementation-dependent order that is typically the same as Unicode codepoint order; in R6RS and R7RS, it is Unicode codepoint order. 5 When comparing pairs, it must behave the same as a comparator returned by make-pair-comparator with default comparators as arguments. 6 When comparing symbols, it must use an implementation-dependent total order. One possibility is to use the order obtained by applying symbol->string to the symbols and comparing them using the total order implied by string<?. 7 When comparing bytevectors, it must behave the same as a comparator created by the expression (make-vector-comparator (make-comparator bytevector? = < number-hash) bytevector? bytevector-length bytevector-u8-ref). 8 When comparing numbers where either number is complex, since non-real numbers cannot be compared with <, the following least-surprising ordering is defined: If the real parts are < or >, so are the numbers; otherwise, the numbers are ordered by their imaginary parts. This can still produce somewhat surprising results if one real part is exact and the other is inexact. 9 When comparing real numbers, it must use = and <. 10 When comparing strings, it must use string=? and string<?. Note: In R5RS, this is lexicographic order on the implementation-dependent order defined by char<?; in R6RS it is lexicographic order on Unicode codepoint order; in R7RS it is an implementation-defined order. 11 When comparing vectors, it must behave the same as a comparator returned by (make-vector-comparator (make-default-comparator) vector? vector-length vector-ref). 12 When comparing members of types registered with comparator-register-default!, it must behave in the same way as the comparator registered using that function. Default comparators use default-hash as their hash function.
( make-default-comparator ) comparator?
Returns a comparator known as a default comparator that accepts Scheme values and orders them in some implementation-defined way, subject to the following conditions: 1 Given disjoint types a and b, one of three conditions must hold: 1.1 All objects of type a compare less than all objects of type b. 1.2 All objects of type a compare greater than all objects of type b. 1.3 All objects of both type a and type b compare equal to each other. This is not permitted for any of the Scheme types mentioned below. 2 The empty list must be ordered before all pairs. 3 When comparing booleans, it must use the total order #f < #t. 4 When comparing characters, it must use char=? and char<?. Note: In R5RS, this is an implementation-dependent order that is typically the same as Unicode codepoint order; in R6RS and R7RS, it is Unicode codepoint order. 5 When comparing pairs, it must behave the same as a comparator returned by make-pair-comparator with default comparators as arguments. 6 When comparing symbols, it must use an implementation-dependent total order. One possibility is to use the order obtained by applying symbol->string to the symbols and comparing them using the total order implied by string<?. 7 When comparing bytevectors, it must behave the same as a comparator created by the expression (make-vector-comparator (make-comparator bytevector? = < number-hash) bytevector? bytevector-length bytevector-u8-ref). 8 When comparing numbers where either number is complex, since non-real numbers cannot be compared with <, the following least-surprising ordering is defined: If the real parts are < or >, so are the numbers; otherwise, the numbers are ordered by their imaginary parts. This can still produce somewhat surprising results if one real part is exact and the other is inexact. 9 When comparing real numbers, it must use = and <. 10 When comparing strings, it must use string=? and string<?. Note: In R5RS, this is lexicographic order on the implementation-dependent order defined by char<?; in R6RS it is lexicographic order on Unicode codepoint order; in R7RS it is an implementation-defined order. 11 When comparing vectors, it must behave the same as a comparator returned by (make-vector-comparator (make-default-comparator) vector? vector-length vector-ref). 12 When comparing members of types registered with comparator-register-default!, it must behave in the same way as the comparator registered using that function. Default comparators use default-hash as their hash function.
( make-eq-comparator ) comparator?
make-eq-comparator, make-eqv-comparator, make-equal-comparator These procedures return comparators whose functions behave as follows: 1 The type test returns #t in all cases. 2 The equality functions are eq?, eqv?, and equal? respectively. 3 The ordering function is implementation-defined, except that it must conform to the rules for ordering functions. It may signal an error instead. 4 The hash function is default-hash.
( make-eq-comparator ) comparator?
make-eq-comparator, make-eqv-comparator, make-equal-comparator These procedures return comparators whose functions behave as follows: 1 The type test returns #t in all cases. 2 The equality functions are eq?, eqv?, and equal? respectively. 3 The ordering function is implementation-defined, except that it must conform to the rules for ordering functions. It may signal an error instead. 4 The hash function is default-hash.
( make-equal-comparator ) comparator?
make-eq-comparator, make-eqv-comparator, make-equal-comparator These procedures return comparators whose functions behave as follows: 1 The type test returns #t in all cases. 2 The equality functions are eq?, eqv?, and equal? respectively. 3 The ordering function is implementation-defined, except that it must conform to the rules for ordering functions. It may signal an error instead. 4 The hash function is default-hash.
( make-equal-comparator ) comparator?
make-eq-comparator, make-eqv-comparator, make-equal-comparator These procedures return comparators whose functions behave as follows: 1 The type test returns #t in all cases. 2 The equality functions are eq?, eqv?, and equal? respectively. 3 The ordering function is implementation-defined, except that it must conform to the rules for ordering functions. It may signal an error instead. 4 The hash function is default-hash.
( make-eqv-comparator ) comparator?
make-eq-comparator, make-eqv-comparator, make-equal-comparator These procedures return comparators whose functions behave as follows: 1 The type test returns #t in all cases. 2 The equality functions are eq?, eqv?, and equal? respectively. 3 The ordering function is implementation-defined, except that it must conform to the rules for ordering functions. It may signal an error instead. 4 The hash function is default-hash.
( make-eqv-comparator ) comparator?
make-eq-comparator, make-eqv-comparator, make-equal-comparator These procedures return comparators whose functions behave as follows: 1 The type test returns #t in all cases. 2 The equality functions are eq?, eqv?, and equal? respectively. 3 The ordering function is implementation-defined, except that it must conform to the rules for ordering functions. It may signal an error instead. 4 The hash function is default-hash.
( make-list-comparator [ comparator? element-comparator ] [ procedure? type-test ] [ procedure? empty? ] [ procedure? head ] [ procedure? tail ] ) comparator?
type-test ( λ obj ) boolean?
empty? ( λ obj ) boolean?
head ( λ obj ) *
tail ( λ obj ) *
This procedure returns comparators whose functions behave as follows: 1 The type test returns #t if its argument satisfies type-test and the elements satisfy the type test predicate of element-comparator. 2 The total order defined by the equality and ordering functions is as follows (known as lexicographic order): 2.1 The empty sequence, as determined by calling empty?, compares equal to itself. 2.2 The empty sequence compares less than any non-empty sequence. 2.3 Two non-empty sequences are compared by calling the head procedure on each. If the heads are not equal when compared using element-comparator, the result is the result of that comparison. Otherwise, the results of calling the tail procedure are compared recursively. 3 The hash function computes the hash values of the elements using the hash function of element-comparator and then hashes them together in an implementation-defined way.
( make-list-comparator [ comparator? element-comparator ] [ procedure? type-test ] [ procedure? empty? ] [ procedure? head ] [ procedure? tail ] ) comparator?
type-test ( λ obj ) boolean?
empty? ( λ obj ) boolean?
head ( λ obj ) *
tail ( λ obj ) *
This procedure returns comparators whose functions behave as follows: 1 The type test returns #t if its argument satisfies type-test and the elements satisfy the type test predicate of element-comparator. 2 The total order defined by the equality and ordering functions is as follows (known as lexicographic order): 2.1 The empty sequence, as determined by calling empty?, compares equal to itself. 2.2 The empty sequence compares less than any non-empty sequence. 2.3 Two non-empty sequences are compared by calling the head procedure on each. If the heads are not equal when compared using element-comparator, the result is the result of that comparison. Otherwise, the results of calling the tail procedure are compared recursively. 3 The hash function computes the hash values of the elements using the hash function of element-comparator and then hashes them together in an implementation-defined way.
( make-pair-comparator [ comparator? car-comparator ] [ comparator? cdr-comparator ] ) comparator?
This procedure returns comparators whose functions behave as follows. 1 The type test returns #t if its argument is a pair, if the car satisfies the type test predicate of car-comparator, and the cdr satisfies the type test predicate of cdr-comparator. 2 The equality function returns #t if the cars are equal according to car-comparator and the cdrs are equal according to cdr-comparator, and #f otherwise. 3 The ordering function first compares the cars of its pairs using the equality predicate of car-comparator. If they are not equal, then the ordering predicate of car-comparator is applied to the cars and its value is returned. Otherwise, the predicate compares the cdrs using the equality predicate of cdr-comparator. If they are not equal, then the ordering predicate of cdr-comparator is applied to the cdrs and its value is returned. 4 The hash function computes the hash values of the car and the cdr using the hash functions of car-comparator and cdr-comparator respectively and then hashes them together in an implementation-defined way.
( make-pair-comparator [ comparator? car-comparator ] [ comparator? cdr-comparator ] ) comparator?
This procedure returns comparators whose functions behave as follows. 1 The type test returns #t if its argument is a pair, if the car satisfies the type test predicate of car-comparator, and the cdr satisfies the type test predicate of cdr-comparator. 2 The equality function returns #t if the cars are equal according to car-comparator and the cdrs are equal according to cdr-comparator, and #f otherwise. 3 The ordering function first compares the cars of its pairs using the equality predicate of car-comparator. If they are not equal, then the ordering predicate of car-comparator is applied to the cars and its value is returned. Otherwise, the predicate compares the cdrs using the equality predicate of cdr-comparator. If they are not equal, then the ordering predicate of cdr-comparator is applied to the cdrs and its value is returned. 4 The hash function computes the hash values of the car and the cdr using the hash functions of car-comparator and cdr-comparator respectively and then hashes them together in an implementation-defined way.
( make-vector-comparator [ comparator? element-comparator ] [ procedure? type-test ] [ procedure? length ] [ procedure? ref ] ) comparator?
type-test ( λ obj ) boolean?
length ( λ obj ) integer?
ref ( λ vec [ integer? index ] ) *
This procedure returns comparators whose functions behave as follows: 1 The type test returns #t if its argument satisfies type-test and the elements satisfy the type test predicate of element-comparator. 2 The equality predicate returns #t if both of the following tests are satisfied in order: the lengths of the vectors are the same in the sense of =, and the elements of the vectors are the same in the sense of the equality predicate of element-comparator. 3 The ordering predicate returns #t if the results of applying length to the first vector is less than the result of applying length to the second vector. If the lengths are equal, then the elements are examined pairwise using the ordering predicate of element-comparator. If any pair of elements returns #t, then that is the result of the list comparator's ordering predicate; otherwise the result is #f 4 The hash function computes the hash values of the elements using the hash function of element-comparator and then hashes them together in an implementation-defined way.
( make-vector-comparator [ comparator? element-comparator ] [ procedure? type-test ] [ procedure? length ] [ procedure? ref ] ) comparator?
type-test ( λ obj ) boolean?
length ( λ obj ) integer?
ref ( λ vec [ integer? index ] ) *
This procedure returns comparators whose functions behave as follows: 1 The type test returns #t if its argument satisfies type-test and the elements satisfy the type test predicate of element-comparator. 2 The equality predicate returns #t if both of the following tests are satisfied in order: the lengths of the vectors are the same in the sense of =, and the elements of the vectors are the same in the sense of the equality predicate of element-comparator. 3 The ordering predicate returns #t if the results of applying length to the first vector is less than the result of applying length to the second vector. If the lengths are equal, then the elements are examined pairwise using the ordering predicate of element-comparator. If any pair of elements returns #t, then that is the result of the list comparator's ordering predicate; otherwise the result is #f 4 The hash function computes the hash values of the elements using the hash function of element-comparator and then hashes them together in an implementation-defined way.