Skip to content

Commit f135e5a

Browse files
committed
Fixing wrong number of argument and infinite loop on refining comparator
(Fixes #321)
1 parent afbcbf2 commit f135e5a

File tree

2 files changed

+41
-20
lines changed

2 files changed

+41
-20
lines changed

sitelib/srfi/%3a114/comparators.scm

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2929
;;;
3030

31+
#!nounbound
3132
(library (srfi :114 comparators)
3233
(export comparator? comparator-comparison-procedure?
3334
comparator-hash-function?
@@ -390,7 +391,7 @@
390391
(if (zero? index)
391392
result
392393
(let* ((prod (mod (* result 33) +limit+))
393-
(sum (mod (+ prod (hash (ref x index)) +limit+))))
394+
(sum (mod (+ prod (hash (ref x index))) +limit+)))
394395
(loop (- index 1) sum))))))
395396

396397
(define (make-listwise-comparator test comparator nil? kar kdr)
@@ -448,7 +449,7 @@
448449
(define (make-cdr-comparator comparator)
449450
(make-comparator
450451
pair? #t
451-
(lambda (a b) (comparator-compare (cdr a) (cdr b)))
452+
(lambda (a b) (comparator-compare comparator (cdr a) (cdr b)))
452453
(lambda (obj) (comparator-hash comparator (cdr obj)))))
453454

454455
(define (make-pair-comparison car-comparator cdr-comparator)
@@ -549,8 +550,8 @@
549550
(let loop ((comparator (matching-comparator a comparators))
550551
(first? #t))
551552
(if comparator
552-
(if (comparator-equal? a b)
553-
(loop (matching-comparator a comparators) #f)
553+
(if (comparator-equal? comparator a b)
554+
(loop (matching-comparator a (remq comparator comparators)) #f)
554555
#f)
555556
(or (not first?)
556557
(error 'refined-equality-predicate
@@ -561,9 +562,9 @@
561562
(let loop ((comparator (matching-comparator a comparators))
562563
(first? #t))
563564
(if comparator
564-
(let ((result (comparator-compare a b)))
565+
(let ((result (comparator-compare comparator a b)))
565566
(if (eqv? result 0)
566-
(loop (matching-comparator a comparators) #f)
567+
(loop (matching-comparator a (remq comparator comparators)) #f)
567568
result))
568569
(if first?
569570
(error 'refined-comparison-procedure
@@ -616,24 +617,26 @@
616617
'comparison 'reflexive))
617618

618619
(define (check-symmetric-equality comparator a b)
619-
(if (comparator-equal? a b)
620-
(debug-assert (comparator-equal? b a) 'equality 'symmetric))
621-
(if (not (comparator-equal? a b))
622-
(debug-deny (comparator-equal? b a) 'equality 'symmetric)))
620+
(if (comparator-equal? comparator a b)
621+
(debug-assert (comparator-equal? comparator b a) 'equality 'symmetric))
622+
(if (not (comparator-equal? comparator a b))
623+
(debug-deny (comparator-equal? comparator b a) 'equality 'symmetric)))
623624

624625
(define (check-asymmetric-comparison comparator a b)
625626
(debug-assert (eqv?
626-
(comparator-compare a b)
627-
(- (comparator-compare a b)))
627+
(comparator-compare comparator a b)
628+
(- (comparator-compare comparator a b)))
628629
'comparison 'asymmetric))
629630

630631
(define (check-transitive-equality comparator a b c)
631-
(and (comparator-equal? a b) (comparator-equal? b c)
632-
(debug-assert (comparator-equal? a c) 'equality 'transitive))
633-
(and (comparator-equal? a b) (not (comparator-equal? b c))
634-
(debug-deny (comparator-equal? a c) 'equality 'transitive))
635-
(and (not (comparator-equal? a b)) (comparator-equal? b c)
636-
(debug-deny (comparator-equal? a c) 'equality 'transitive)))
632+
(and (comparator-equal? comparator a b) (comparator-equal? comparator b c)
633+
(debug-assert (comparator-equal? comparator a c) 'equality 'transitive))
634+
(and (comparator-equal? comparator a b)
635+
(not (comparator-equal? comparator b c))
636+
(debug-deny (comparator-equal? comparator a c) 'equality 'transitive))
637+
(and (not (comparator-equal? comparator a b))
638+
(comparator-equal? comparator b c)
639+
(debug-deny (comparator-equal? comparator a c) 'equality 'transitive)))
637640

638641
(define (check-transitive-comparison comparator a b c)
639642
(define <= (<=? comparator))
@@ -675,12 +678,12 @@
675678
(lambda (a b)
676679
(check-all comparator a b c c?)
677680
(when (not c?) (set! c a) (set! c? #t))
678-
(comparator-equal? comparator))
681+
(comparator-equal? comparator a b))
679682
(if (comparator-comparison-procedure? comparator)
680683
(lambda (a b)
681684
(check-all comparator a b c c?)
682685
(when (not c?) (set! c b) (set! c? #t))
683-
(comparator-compare comparator))
686+
(comparator-compare comparator a b))
684687
#f)
685688
(if (comparator-hash-function? comparator)
686689
(lambda (obj)

test/tests/srfi/%3a114.scm

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,22 @@
116116
(test-equal "car hash" carh (comparator-hash car-comparator '(car . cdr)))
117117
(test-equal "cdr hash" cdrh (comparator-hash cdr-comparator '(car . cdr))))
118118

119+
;; wrong number of argument during compilation...
120+
(let ((vech (comparator-hash vector-comparator #(1 2 3))))
121+
(define vec-comparator (make-vector-comparator default-comparator))
122+
(test-equal "vector hash" vech (comparator-hash vec-comparator #(1 2 3))))
123+
124+
(define (test-comparator comparator v)
125+
(test-assert "compare" (comparator-compare comparator v v))
126+
(test-assert "hash" (comparator-hash comparator v)))
127+
128+
(let ((v '(a b c)))
129+
(test-comparator (make-car-comparator default-comparator) v)
130+
(test-comparator (make-cdr-comparator list-comparator) v)
131+
(test-comparator (make-pair-comparator default-comparator list-comparator) v)
132+
(test-comparator (make-refining-comparator list-comparator) v)
133+
(test-comparator (make-debug-comparator list-comparator) v)
134+
)
135+
136+
119137
(test-end)

0 commit comments

Comments
 (0)