[gambit-list] [PATCH] Make "clean exception handling" switchable, and off by default

Christian Jaeger christian at pflanze.mine.nu
Thu Nov 27 06:04:56 EST 2008


Introduces a parameter object in |current-clean-exception-handling|,
which is set to #f by default.

With clean exception handling switched off, exceptions happening
during macro expansion trap into the repl at the point of the error.

Signed-off-by: Christian Jaeger <christian at pflanze.mine.nu>
---
 Example:
 $ cat t.scm
 (define-macro (hello . body)
   (let ((v (error "an error")))
     `(display (list "Hm: " ',v ',body))))

 (hello "hua")

 > (include "t.scm")
 *** ERROR IN #<procedure #2>, "t.scm"@2.12 -- an error
 1> 

 ;; restore the old behaviour:
 > (current-clean-exception-handling #t)
 > (include "t.scm")                    
 *** ERROR -- an error
 > 


 lib/_repl.scm |   23 +++++++++++++++--------
 1 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/lib/_repl.scm b/lib/_repl.scm
index 3dc0aac..fe41fb6 100644
--- a/lib/_repl.scm
+++ b/lib/_repl.scm
@@ -2275,17 +2275,24 @@
 
   (##exit))
 
+
+(define current-clean-exception-handling (make-parameter #f))
+
+
 (define-prim (##repl-within cont write-reason)
 
   (define (with-clean-exception-handling repl-context thunk)
-    (##with-exception-catcher
-     (lambda (exc)
-       (##continuation-graft ;; get rid of any useless continuation frames
-        (macro-repl-context-cont repl-context)
-        (lambda ()
-          (release-ownership!)
-          (macro-raise exc))))
-     thunk))
+    (let ((old-handler (current-exception-handler)))
+      (with-exception-handler
+       (lambda (exc)
+	 (if (current-clean-exception-handling)
+	     (##continuation-graft ;; get rid of any useless continuation frames
+	      (macro-repl-context-cont repl-context)
+	      (lambda ()
+		(release-ownership!)
+		(macro-raise exc)))
+	     (old-handler exc)))
+       thunk)))
 
   (define (acquire-ownership!)
     (##repl-channel-acquire-ownership!))
-- 
1.6.0.4




More information about the Gambit-list mailing list