~ chicken-r7rs (master) cdd031c5aa08edb8c453b7f6f5efd4e9e73c32ff


commit cdd031c5aa08edb8c453b7f6f5efd4e9e73c32ff
Author:     Evan Hanson <evhan@foldling.org>
AuthorDate: Thu Oct 24 22:08:28 2013 +0000
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Thu Oct 24 22:08:28 2013 +0000

    Extended-arity char*? and string*? comparators

diff --git a/scheme.base-interface.scm b/scheme.base-interface.scm
index bed6bbf..823f129 100644
--- a/scheme.base-interface.scm
+++ b/scheme.base-interface.scm
@@ -32,7 +32,9 @@
   ceiling
   char-ready?
   char->integer integer->char
-  char<? char>? char<=? char>=?
+  |#
+  char=? char<? char>? char<=? char>=?
+  #|
   char?
   close-input-port close-output-port
   |#
@@ -181,7 +183,9 @@
   string-length
   string-map
   string-ref string-set!
+  |#
   string=? string<? string>? string<=? string>=?
+  #|
   string?
   substring
   symbol=?
diff --git a/scheme.base.scm b/scheme.base.scm
index eecb4ab..6f78058 100644
--- a/scheme.base.scm
+++ b/scheme.base.scm
@@ -1,6 +1,12 @@
 (module scheme.base ()
 
-(import (except scheme syntax-rules cond-expand member))
+(import (except scheme syntax-rules cond-expand
+                       assoc list-set! list-tail member
+                       char=? char<? char>? char<=? char>=?
+                       string=? string<? string>? string<=? string>=?))
+(import (prefix (only scheme char=? char<? char>? char<=? char>=?
+                             string=? string<? string>? string<=? string>=?)
+                %))
 (import (except chicken with-exception-handler raise quotient remainder modulo))
 (import numbers)
 
@@ -221,6 +227,51 @@
         (##sys#fast-reverse res)
         (lp (cons (car lst) res) (cdr lst)))))
 
+;;;
+;;; 6.6 Characters
+;;;
+
+(define-syntax define-extended-arity-comparator
+  (syntax-rules ()
+    ((_ name comparator check-type)
+     (define name
+       (let ((cmp comparator))
+         (lambda (o1 o2 . os)
+           (check-type o1 'name)
+           (let lp ((o1 o1) (o2 o2) (os os) (eq #t))
+             (check-type o2 'name)
+             (if (null? os)
+                 (and eq (cmp o1 o2))
+                 (lp o2 (car os) (cdr os) (and eq (cmp o1 o2)))))))))))
+
+(: char=? (char char #!rest char -> boolean))
+(: char<? (char char #!rest char -> boolean))
+(: char>? (char char #!rest char -> boolean))
+(: char<=? (char char #!rest char -> boolean))
+(: char>=? (char char #!rest char -> boolean))
+
+(define-extended-arity-comparator char=? %char=? ##sys#check-char)
+(define-extended-arity-comparator char>? %char>? ##sys#check-char)
+(define-extended-arity-comparator char<? %char<? ##sys#check-char)
+(define-extended-arity-comparator char<=? %char<=? ##sys#check-char)
+(define-extended-arity-comparator char>=? %char>=? ##sys#check-char)
+
+;;;
+;;; 6.7 Strings
+;;;
+
+(: string=? (string string #!rest string -> boolean))
+(: string<? (string string #!rest string -> boolean))
+(: string>? (string string #!rest string -> boolean))
+(: string<=? (string string #!rest string -> boolean))
+(: string>=? (string string #!rest string -> boolean))
+
+(define-extended-arity-comparator string=? %string=? ##sys#check-string)
+(define-extended-arity-comparator string<? %string<? ##sys#check-string)
+(define-extended-arity-comparator string>? %string>? ##sys#check-string)
+(define-extended-arity-comparator string<=? %string<=? ##sys#check-string)
+(define-extended-arity-comparator string>=? %string>=? ##sys#check-string)
+
 ;;;
 ;;; 6.11. Exceptions
 ;;;
diff --git a/tests/run.scm b/tests/run.scm
index a111879..412d933 100644
--- a/tests/run.scm
+++ b/tests/run.scm
@@ -299,6 +299,50 @@
    (test '((3 8 2 8)) (list b))
    (test '((1 8 2 8)) (list a))))
 
+(test-group "6.6: characters"
+  (test-group "char*?"
+    (test-error "arity" (char=? #\a))
+    (test-error "type check" (char=? #\a #\a 1))
+    (test-error "no shortcutting" (char=? #\a #\b 1))
+    (test #t (char=? #\a #\a))
+    (test #f (char=? #\a #\b))
+    (test #t (char=? #\a #\a #\a))
+    (test #f (char=? #\a #\b #\a))
+    (test #f (char=? #\a #\a #\b))
+    (test #t (char=? #\a #\a #\a #\a))
+    (test #f (char=? #\a #\b #\a #\a))
+    (test #f (char=? #\a #\a #\a #\b))
+    (test #t (char<? #\a #\b #\c))
+    (test #f (char<? #\a #\b #\b))
+    (test #t (char<=? #\a #\b #\b))
+    (test #f (char<=? #\a #\b #\a))
+    (test #t (char>? #\c #\b #\a))
+    (test #f (char>? #\a #\a #\a))
+    (test #t (char>=? #\b #\b #\a))
+    (test #f (char>=? #\b #\a #\b))))
+
+(test-group "6.7: strings"
+  (test-group "string*?"
+    (test-error "arity" (string=? "a"))
+    (test-error "type check" (string=? "a" "a" 1))
+    (test-error "no shortcutting" (string=? "a" "b" 1))
+    (test #t (string=? "a" "a"))
+    (test #f (string=? "a" "b"))
+    (test #t (string=? "a" "a" "a"))
+    (test #f (string=? "a" "b" "a"))
+    (test #f (string=? "a" "a" "b"))
+    (test #t (string=? "a" "a" "a" "a"))
+    (test #f (string=? "a" "b" "a" "a"))
+    (test #f (string=? "a" "a" "a" "b"))
+    (test #t (string<? "a" "b" "c"))
+    (test #f (string<? "a" "b" "b"))
+    (test #t (string<=? "a" "b" "b"))
+    (test #f (string<=? "a" "b" "a"))
+    (test #t (string>? "c" "b" "a"))
+    (test #f (string>? "c" "b" "b"))
+    (test #t (string>=? "b" "b" "a"))
+    (test #f (string>=? "b" "a" "b"))))
+
 (define-syntax catch
   (syntax-rules ()
     ((_ . body) (handle-exceptions e e . body))))
Trap