diff --git a/lib/init-7.scm b/lib/init-7.scm index e915b693..311f46e7 100644 --- a/lib/init-7.scm +++ b/lib/init-7.scm @@ -346,22 +346,31 @@ (define (char-upper-case? ch) (<= 65 (char->integer ch) 90)) (define (char-lower-case? ch) (<= 97 (char->integer ch) 122)) -(define (char=? a b) (= (char->integer a) (char->integer b))) -(define (charinteger a) (char->integer b))) -(define (char>? a b) (> (char->integer a) (char->integer b))) -(define (char<=? a b) (<= (char->integer a) (char->integer b))) -(define (char>=? a b) (>= (char->integer a) (char->integer b))) +(define (char-cmp op a ls) + (let lp ((op op) (a (char->integer a)) (ls ls)) + (if (null? ls) + #t + (let ((b (char->integer (car ls)))) + (and (op a b) (lp op b (cdr ls))))))) -(define (char-ci=? a b) - (= (char->integer (char-downcase a)) (char->integer (char-downcase b)))) -(define (char-ciinteger (char-downcase a)) (char->integer (char-downcase b)))) -(define (char-ci>? a b) - (> (char->integer (char-downcase a)) (char->integer (char-downcase b)))) -(define (char-ci<=? a b) - (<= (char->integer (char-downcase a)) (char->integer (char-downcase b)))) -(define (char-ci>=? a b) - (>= (char->integer (char-downcase a)) (char->integer (char-downcase b)))) +(define (char=? a . ls) (char-cmp = a ls)) +(define (char? a . ls) (char-cmp > a ls)) +(define (char<=? a . ls) (char-cmp <= a ls)) +(define (char>=? a . ls) (char-cmp >= a ls)) + +(define (char-cmp-ci op a ls) + (let lp ((op op) (a (char->integer (char-downcase a))) (ls ls)) + (if (null? ls) + #t + (let ((b (char->integer (char-downcase (car ls))))) + (and (op a b) (lp op b (cdr ls))))))) + +(define (char-ci=? a . ls) (char-cmp-ci = a ls)) +(define (char-ci? a . ls) (char-cmp-ci > a ls)) +(define (char-ci<=? a . ls) (char-cmp-ci <= a ls)) +(define (char-ci>=? a . ls) (char-cmp-ci >= a ls)) ;; string utils diff --git a/lib/scheme/char/full.scm b/lib/scheme/char/full.scm index c62da9a9..a748c56b 100644 --- a/lib/scheme/char/full.scm +++ b/lib/scheme/char/full.scm @@ -49,11 +49,18 @@ (integer->char (- n (cdar ls)))) (else (lp (cdr ls))))))) -(define (char-ci<=? a b) (char<=? (char-foldcase a) (char-foldcase b))) -(define (char-ci=? a b) (char>=? (char-foldcase a) (char-foldcase b))) -(define (char-ci>? a b) (char>? (char-foldcase a) (char-foldcase b))) +(define (char-cmp-ci op a ls) + (let lp ((op op) (a (char->integer (char-foldcase a))) (ls ls)) + (if (null? ls) + #t + (let ((b (char->integer (char-downcase (car ls))))) + (and (op a b) (lp op b (cdr ls))))))) + +(define (char-ci=? a . ls) (char-cmp-ci = a ls)) +(define (char-ci? a . ls) (char-cmp-ci > a ls)) +(define (char-ci<=? a . ls) (char-cmp-ci <= a ls)) +(define (char-ci>=? a . ls) (char-cmp-ci >= a ls)) (define (string-downcase str) (string-map char-downcase str)) diff --git a/tests/r7rs-tests.scm b/tests/r7rs-tests.scm index 2ea30edb..a2e4282c 100644 --- a/tests/r7rs-tests.scm +++ b/tests/r7rs-tests.scm @@ -870,36 +870,36 @@ (test #f (char? 'a)) (test #f (char? 0)) -(test #t (char=? #\a #\a)) +(test #t (char=? #\a #\a #\a)) (test #f (char=? #\a #\A)) -(test #t (char? #\a #\b)) (test #f (char>? #\a #\a)) -(test #t (char>? #\b #\a)) -(test #t (char<=? #\a #\b)) +(test #t (char>? #\c #\b #\a)) +(test #t (char<=? #\a #\b #\b)) (test #t (char<=? #\a #\a)) (test #f (char<=? #\b #\a)) (test #f (char>=? #\a #\b)) (test #t (char>=? #\a #\a)) -(test #t (char>=? #\b #\a)) +(test #t (char>=? #\b #\b #\a)) (test #t (char-ci=? #\a #\a)) -(test #t (char-ci=? #\a #\A)) +(test #t (char-ci=? #\a #\A #\a)) (test #f (char-ci=? #\a #\b)) -(test #t (char-ci? #\A #\b)) (test #f (char-ci>? #\a #\A)) -(test #t (char-ci>? #\B #\a)) -(test #t (char-ci<=? #\a #\B)) +(test #t (char-ci>? #\c #\B #\a)) +(test #t (char-ci<=? #\a #\B #\b)) (test #t (char-ci<=? #\A #\a)) (test #f (char-ci<=? #\b #\A)) (test #f (char-ci>=? #\A #\b)) (test #t (char-ci>=? #\a #\A)) -(test #t (char-ci>=? #\B #\a)) +(test #t (char-ci>=? #\b #\B #\a)) (test #t (char-alphabetic? #\a)) (test #f (char-alphabetic? #\space))