From 5d2a9bcc3df76204c97115e0ff8738df1d6ea1a3 Mon Sep 17 00:00:00 2001 From: Alex Shinn <alexshinn@gmail.com> Date: Fri, 31 Jul 2020 15:09:46 +0900 Subject: [PATCH] SRFI 160 vector= differs from SRFI 133 in not taking an eq predicate (issue #674) --- lib/srfi/160/test.sld | 12 ++++++------ lib/srfi/160/uvector.scm | 29 ++++++++++++++--------------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/lib/srfi/160/test.sld b/lib/srfi/160/test.sld index 9f5ca0a7..64d845fd 100644 --- a/lib/srfi/160/test.sld +++ b/lib/srfi/160/test.sld @@ -31,12 +31,12 @@ (test-group "uvectors/predicates" (test #f (u32vector-empty? '#u32(0))) (test-assert (u32vector-empty? '#u32())) - (test-assert (u32vector= eq? '#u32(0 1 2 3) '#u32(0 1 2 3))) - (test #t (u32vector= eq? '#u32(0 1 2 3) '#u32(0 1 2 3))) - (test #f (u32vector= = '#u32(1 2 3 4 5) '#u32(1 2 3 4))) - (test-assert (u32vector= eq?)) - (test-assert (u32vector= eq? '#u32(0))) - (test-assert (u32vector= equal? (u32vector 0) (u32vector 0))) + (test-assert (u32vector= '#u32(0 1 2 3) '#u32(0 1 2 3))) + (test #t (u32vector= '#u32(0 1 2 3) '#u32(0 1 2 3))) + (test #f (u32vector= '#u32(1 2 3 4 5) '#u32(1 2 3 4))) + (test-assert (u32vector=)) + (test-assert (u32vector= '#u32(0))) + (test-assert (u32vector= (u32vector 0) (u32vector 0))) ) (test-group "uvectors/iteration" diff --git a/lib/srfi/160/uvector.scm b/lib/srfi/160/uvector.scm index 515c522d..82bba234 100644 --- a/lib/srfi/160/uvector.scm +++ b/lib/srfi/160/uvector.scm @@ -2,21 +2,20 @@ (define (vector-empty? vec) (zero? (uvector-length vec))) -(define (vector= eq . o) - (cond - ((null? o) #t) - ((null? (cdr o)) #t) - (else - (and (let* ((v1 (car o)) - (v2 (cadr o)) - (len (uvector-length v1))) - (and (= len (uvector-length v2)) - (let lp ((i 0)) - (or (>= i len) - (and (eq (uvector-ref v1 i) - (uvector-ref v2 i)) - (lp (+ i 1))))))) - (apply vector= eq (cdr o)))))) +(define (vector= . vecs) + (let lp1 ((ls vecs)) + (or (null? ls) + (null? (cdr ls)) + (let* ((v1 (car ls)) + (v2 (cadr ls)) + (len (uvector-length v1))) + (and (= len (uvector-length v2)) + (let lp2 ((i 0)) + (or (>= i len) + (and (= (uvector-ref v1 i) + (uvector-ref v2 i)) + (lp2 (+ i 1))))) + (lp1 (cdr ls))))))) (define (list->uvector ls) (let ((res (make-uvector (length ls))))