summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-04-10 16:34:09 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-04-10 16:34:09 -0700
commit710889ccdf6f8f8501f0a9409258b3850002d41d (patch)
treeb67c9a4a55f973c3622ee5c029e586ccf211b571 /share
parent079e081ab3f1a1bef175d8185c80108d16452c74 (diff)
downloadtxr-710889ccdf6f8f8501f0a9409258b3850002d41d.tar.gz
txr-710889ccdf6f8f8501f0a9409258b3850002d41d.tar.bz2
txr-710889ccdf6f8f8501f0a9409258b3850002d41d.zip
New catch** macro.
* lisplib.c (except_set_entries): Autoload for catch** symbol. * share/txr/stdlib/except.tl (catch**): New macro. * txr.1: Document catch** macro, and the desc slot of the catch-frame struct.
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/except.tl14
1 files changed, 14 insertions, 0 deletions
diff --git a/share/txr/stdlib/except.tl b/share/txr/stdlib/except.tl
index a2cc684c..73ba253d 100644
--- a/share/txr/stdlib/except.tl
+++ b/share/txr/stdlib/except.tl
@@ -41,6 +41,20 @@
(let ((catch-syms [mapcar car catch-clauses]))
^(sys:catch ,catch-syms ,try-form nil ,*catch-clauses)))
+(defmacro catch** (try-form . catch-clauses)
+ (let ((catch-syms [mapcar car catch-clauses])
+ sys-catch-clauses descs)
+ (each ((cl catch-clauses))
+ (mac-param-bind cl (type desc args . body) cl
+ (push ^(,type ,args ,*body) sys-catch-clauses)
+ (push desc descs)))
+ (sys:setq sys-catch-clauses (nreverse sys-catch-clauses))
+ (sys:setq descs (nreverse descs))
+ (let ((desc-expr (if [all descs constantp]
+ ^'(,*[mapcar eval descs])
+ ^(list ,*descs))))
+ ^(sys:catch ,catch-syms ,try-form ,desc-expr ,*sys-catch-clauses))))
+
(defun sys:expand-handle (form try-form handle-clauses)
(let* ((oper (car form))
(exc-sym (gensym))