~ chicken-r7rs (master) 1318d0141a3b34bc4d79cbc03c02eba5f0ebb9e1


commit 1318d0141a3b34bc4d79cbc03c02eba5f0ebb9e1
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Sat Jul 6 18:59:15 2013 +0000
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Sat Jul 6 18:59:15 2013 +0000

    Add boolean=? to r7rs, and export 'not' and 'boolean?'

diff --git a/scheme.base-interface.scm b/scheme.base-interface.scm
index 42e450d..af87a3b 100644
--- a/scheme.base-interface.scm
+++ b/scheme.base-interface.scm
@@ -9,7 +9,9 @@
   assoc assq assv
   begin
   binary-port?
+  |#
   boolean? boolean=?
+  #|
   bytevector-append bytevector-copy bytevector-copy!
   bytevector-length bytevector-u8-ref bytevector-u8-set!
   bytevector?
@@ -113,7 +115,9 @@
   modulo remainder
   negative? positive?
   newline
+  |#
   not
+  #|
   null?
   number->string string->number
   number?
diff --git a/scheme.base.scm b/scheme.base.scm
index 6f1ebc0..f8adb07 100644
--- a/scheme.base.scm
+++ b/scheme.base.scm
@@ -100,6 +100,28 @@
 ;;;
 (include "synrules.scm")
 
+
+;;;
+;;; 6.3 Booleans
+;;;
+
+;(: boolean=? ((procedure #:enforce) (boolean boolean #!rest boolean) boolean))
+(: boolean=? (boolean boolean #!rest boolean -> boolean))
+
+(define (boolean=? b1 b2 . rest)
+  ;; Loop across all args, checking for booleans.  Don't shortcut and
+  ;; stop when we find nonequality.
+  (let lp ((b1 b1)
+           (b2 b2)
+           (rest rest)
+           (result (eq? b1 b2)))
+    (##sys#check-boolean b1 'boolean=?)
+    (##sys#check-boolean b2 'boolean=?)
+    (if (null? rest)
+        (and result (eq? b1 b2))
+        (lp b2 (car rest) (cdr rest) (and result (eq? b1 b2))))))
+
+
 ;;;
 ;;; 6.11. Exceptions
 ;;;
@@ -210,5 +232,4 @@
 
 (define (eof-object) #!eof)
 
-
 )
diff --git a/tests/run.scm b/tests/run.scm
index f5e48b7..4be5c94 100644
--- a/tests/run.scm
+++ b/tests/run.scm
@@ -17,6 +17,24 @@
  (test #f (read-from-string "#false"))
  (test-error (read-from-string "#faux")))
 
+(test-group "boolean=?"
+  (test #t (boolean=? #t #t))
+  (test #t (boolean=? #t #t #t #t))
+  (test #t (boolean=? #f #f))
+  (test #t (boolean=? #f #f #f #f))
+  (test #f (boolean=? #f #t))
+  (test #f (boolean=? #f #t #t #t))
+  (test #f (boolean=? #f #f #t #t))
+  (test #f (boolean=? #f #f #f #t))
+  (test #f (boolean=? #t #f #f #f))
+  (test #f (boolean=? #t #f #f #t))
+  (test #f (boolean=? #t #t #f #t))
+  (test #f (boolean=? #f #f #f #t))
+  (test #f (boolean=? #f #t #f #f))
+  (test-error (boolean=? #f))
+  (test-error (boolean=? #f 1))
+  (test-error "no shortcutting" (boolean=? #f #t 2)))
+
 (define-syntax catch
   (syntax-rules ()
     ((_ . body) (handle-exceptions e e . body))))
Trap