aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2022-10-16 22:10:18 +0200
committerHugo Hörnquist <hugo@lysator.liu.se>2022-10-16 23:28:34 +0200
commit377171cfe46aae3b27ad6221adbf4521359c2d52 (patch)
tree8df4f004ea227a93ae1837631d350036679aded8
parentFix wrongly ordered TODO's. (diff)
downloadcalp-377171cfe46aae3b27ad6221adbf4521359c2d52.tar.gz
calp-377171cfe46aae3b27ad6221adbf4521359c2d52.tar.xz
Extend catch to allow pre-unwind handlers.
-rw-r--r--doc/ref/guile/util.texi3
-rw-r--r--module/hnh/util.scm9
2 files changed, 9 insertions, 3 deletions
diff --git a/doc/ref/guile/util.texi b/doc/ref/guile/util.texi
index e2e90c84..f9e6527e 100644
--- a/doc/ref/guile/util.texi
+++ b/doc/ref/guile/util.texi
@@ -321,6 +321,9 @@ body. Restores the old values once we leave.
Macro allowing multiple exception types to be caught. Each (symbol
proc) pair expands to a regular @code{catch}, with the leftmost being
innermost.
+
+@var{Symbol} can also be on the form @code{(pre-unwind @var{symbol})},
+then @code{with-throw-handler} is used instead of @code{catch}.
@end defmac
@subsection UUID generation
diff --git a/module/hnh/util.scm b/module/hnh/util.scm
index bd38a445..929f23a0 100644
--- a/module/hnh/util.scm
+++ b/module/hnh/util.scm
@@ -538,9 +538,12 @@
(define-syntax catch*
- (syntax-rules ()
+ (syntax-rules (pre-unwind)
+ ((_ thunk ((pre-unwind key) handler))
+ (with-throw-handler (quote key) thunk handler))
((_ thunk (key handler))
(catch (quote key) thunk handler))
- ((_ thunk (key handler) rest ...)
- (catch* (lambda () (catch (quote key) thunk handler))
+
+ ((_ thunk pair rest ...)
+ (catch* (lambda () (catch* thunk pair))
rest ...))))