~ chicken-r7rs (master) 07faeff8e5fb5c4f1df8dbaaa5b58292a570cd78


commit 07faeff8e5fb5c4f1df8dbaaa5b58292a570cd78
Author:     Evan Hanson <evhan@foldling.org>
AuthorDate: Wed May 29 11:40:22 2013 +0000
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Wed May 29 11:40:22 2013 +0000

    Add/alias R7RS exception procedures

diff --git a/r7rs.scm b/r7rs.scm
index d974271..ccd77a9 100644
--- a/r7rs.scm
+++ b/r7rs.scm
@@ -1,6 +1,16 @@
 (module r7rs
 
-()
+(
+ ;; Exceptions
+ raise
+ raise-continuable
+ error-object?
+ error-object-message
+ error-object-irritants
+ read-error?
+ file-error?
+ ; TODO guard
+ )
 
 (import chicken scheme)
 (use srfi-13)
@@ -23,4 +33,30 @@
              #t)
             (else (old-hook char port))))))
 
+;;;
+;;; 6.11. Exceptions
+;;;
+
+(define raise abort)
+(define raise-continuable signal)
+(define error-object? condition?)
+(define error-object-message (condition-property-accessor 'exn 'message))
+(define error-object-irritants (condition-property-accessor 'exn 'arguments))
+
+(define-values (read-error? file-error?)
+  (let ((exn?    (condition-predicate 'exn))
+        (i/o?    (condition-predicate 'i/o))
+        (file?   (condition-predicate 'file))
+        (syntax? (condition-predicate 'syntax)))
+    (values
+     ;; read-error?
+     (lambda (obj)
+       (and (exn? obj)
+            (or (i/o? obj) ; XXX Not fine-grained enough.
+                (syntax? obj))))
+     ;; file-error?
+     (lambda (obj)
+       (and (exn? obj)
+            (file? obj))))))
+
 )
diff --git a/tests/run.scm b/tests/run.scm
index d15d114..bf739af 100644
--- a/tests/run.scm
+++ b/tests/run.scm
@@ -9,3 +9,17 @@
  (test #t (read-from-string "#true"))
  (test #f (read-from-string "#false"))
  (test-error (read-from-string "#faux")))
+
+(define-syntax catch
+  (syntax-rules ()
+    ((_ . body) (handle-exceptions e e . body))))
+
+(test-group "exceptions"
+ (test "error-object? (#f)" #f (error-object? 'no))
+ (test "error-object? (#t)" #t (error-object? (catch (car '()))))
+ (test "error-object-message" "fubar" (error-object-message (catch (error "fubar"))))
+ (test "error-object-irritants" '(42) (error-object-irritants (catch (error "fubar" 42))))
+ (test "read-error? (#f)" #f (read-error? (catch (car '()))))
+ (test "read-error? (#t)" #t (read-error? (catch (read-from-string ")"))))
+ (test "file-error? (#f)" #f (file-error? (catch (car '()))))
+ (test "file-error? (#t)" #t (file-error? (catch (open-input-file "foo")))))
Trap