summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-26 06:59:09 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-26 06:59:09 -0700
commit5f107b22b84b603d6bf4a554a4be729883fd6d7c (patch)
treebee7863a816efafafe7ec2bdf5f5f761773a8ddf
parentdff74e03f74fd6fcc2bf31a063c1aa8b871a38ff (diff)
downloadtxr-5f107b22b84b603d6bf4a554a4be729883fd6d7c.tar.gz
txr-5f107b22b84b603d6bf4a554a4be729883fd6d7c.tar.bz2
txr-5f107b22b84b603d6bf4a554a4be729883fd6d7c.zip
compiler: implement handler-bind special op.
* share/txr/stdlib/compiler.tl (compiler compile): Handle defmacro via comp-handler-bind method. (comp-handler-bind): New method.
-rw-r--r--share/txr/stdlib/compiler.tl14
1 files changed, 14 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl
index ad78295c..0c2a2b86 100644
--- a/share/txr/stdlib/compiler.tl
+++ b/share/txr/stdlib/compiler.tl
@@ -178,6 +178,7 @@
((block block*) me.(comp-block oreg env form))
((return-from sys:abscond-from) me.(comp-return-from oreg env form))
(return me.(comp-return oreg env form))
+ (handler-bind me.(comp-handler-bind oreg env form))
((let let*) me.(comp-let oreg env form))
((sys:fbind sys:lbind) me.(comp-fbind oreg env form))
(lambda me.(comp-lambda oreg env form))
@@ -459,6 +460,19 @@
(mac-param-bind form (op value) form
me.(comp-return-from oreg env ^(,op nil ,value))))
+(defmeth compiler comp-handler-bind (me oreg env form)
+ (mac-param-bind form (op func-form ex-syms . body) form
+ (let* ((ffrag me.(compile oreg env func-form))
+ (sreg me.(get-dreg ex-syms))
+ (bfrag me.(comp-progn oreg env body)))
+ (new (frag bfrag.oreg
+ ^(,*ffrag.code
+ (handle ,ffrag.oreg ,sreg)
+ ,*bfrag.code
+ (end ,bfrag.oreg))
+ (uni ffrag.fvars bfrag.fvars)
+ (uni ffrag.ffuns bfrag.ffuns))))))
+
(defmeth compiler comp-let (me oreg env form)
(mac-param-bind form (sym raw-vis . body) form
(let* ((vis (mapcar [iffi atom list] raw-vis))