Next: srfi comparators constructors vector, Previous: srfi comparators constructors pair, Up: srfi comparators constructors [Index]
Build and return a comparator object behaving like
list-comparator but using element-comparator rather than
default-comparator.
#!vicare
(import (vicare) (srfi :114))
(define-constant C
(make-list-comparator exact-integer-comparator))
;; type test
(comparator-test-type C '()) ⇒ #t
(comparator-test-type C '(1 2)) ⇒ #t
(comparator-test-type C '(1 2 . 3)) ⇒ #f
(comparator-test-type C '(1 2.0)) ⇒ #f
(comparator-test-type C "ciao") ⇒ #f
(comparator-test-type C '(1+2i)) ⇒ #f
;; type check
(comparator-check-type C '(1 2)) ⇒ #t
(try
(comparator-check-type C (void))
(catch E
((&comparator-type-error)
#t)
(else E)))
⇒ #t
;; comparison
(comparator-compare C '(1 2) '(1 2)) ⇒ 0)
(comparator-compare C '(1 2) '(1 3)) ⇒ -1
(comparator-compare C '(1 3) '(1 2)) ⇒ +1
(comparator-compare C '() '()) ⇒ 0
(comparator-compare C '() '(1 2)) ⇒ -1
(comparator-compare C '(1 2) '()) ⇒ +1
;; hash
(non-negative-exact-integer?
(comparator-hash C '())) ⇒ #t
(non-negative-exact-integer?
(comparator-hash C '(1 2))) ⇒ #t
Return a comparator which compares two objects that satisfy type-test as if they were lists, using the empty? procedure to determine if an object is empty, and the head and tail procedures to access particular elements.
Return a comparator that compares arbitrary objects as follows: the empty list precedes all pairs, which precede all other objects. Pairs are compared as if with:
(make-pair-comparator element-comparator element-comparator)
All other objects are compared using element-comparator.
Notice that element-comparator is used only to compare elements and compute the hash value elements; it is not used to validate the type of elements.
#!vicare
(import (vicare) (srfi :114))
(module (C)
(define element-compare
(let ((compare (comparator-comparison-procedure
exact-integer-comparator)))
(lambda (A B)
(if (pair? A)
(begin
(assert (pair? B))
(let ((rv (compare (car A) (car B))))
(if (zero? rv)
(comparator-compare C (cdr A) (cdr B))
rv)))
(compare A B)))))
(define-constant E
(make-comparator #t #t
element-compare
(comparator-hash-function default-comparator)))
(define-constant C
(make-improper-list-comparator E))
#| end of module |# )
;; type test
(comparator-test-type C '()) ⇒ #t
(comparator-test-type C '(1 2)) ⇒ #t
(comparator-test-type C '(1 2 . 3)) ⇒ #t
(comparator-test-type C '(1 2.0)) ⇒ #t
(comparator-test-type C "ciao") ⇒ #t
(comparator-test-type C '(1+2i)) ⇒ #t
;; type check
(comparator-check-type C '(1 2)) ⇒ #t
(comparator-check-type C (void)) ⇒ #t
;; comparison
(comparator-compare C '(1 2) '(1 2)) ⇒ 0
(comparator-compare C '(1 2) '(1 3)) ⇒ -1
(comparator-compare C '(1 3) '(1 2)) ⇒ +1
(comparator-compare C '() '()) ⇒ 0
(comparator-compare C '() '(1 2)) ⇒ -1
(comparator-compare C '(1 2) '()) ⇒ +1
(comparator-compare C '(1 2 . 3) '(1 2 . 3)) ⇒ 0
(comparator-compare C '(1 2 . 3) '(1 2 . 4)) ⇒ -1
(comparator-compare C '(1 2 . 4) '(1 2 . 3)) ⇒ +1
(comparator-compare C '(1 2 9 . 3) '(1 2 9 . 3)) ⇒ 0
(comparator-compare C '(1 2 9 . 3) '(1 2 9 . 4)) ⇒ -1
(comparator-compare C '(1 2 9 . 4) '(1 2 9 . 3)) ⇒ +1
;; hash
(non-negative-exact-integer? (comparator-hash C '())) ⇒ #t
(non-negative-exact-integer? (comparator-hash C '(1 2))) ⇒ #t
(non-negative-exact-integer? (comparator-hash C '(1 2 . 3))) ⇒ #t
(non-negative-exact-integer? (comparator-hash C "ciao")) ⇒ #t
Next: srfi comparators constructors vector, Previous: srfi comparators constructors pair, Up: srfi comparators constructors [Index]