summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-22 06:27:27 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-22 06:27:27 -0700
commit9c804b7087e9b332b2cea738fbda493abd36fa1b (patch)
treebf76f3b81255dd89da16bc22af28717e4f9f33da
parent084f913075ede36dd68d6f202307cf043c5a52ac (diff)
downloadtxr-9c804b7087e9b332b2cea738fbda493abd36fa1b.tar.gz
txr-9c804b7087e9b332b2cea738fbda493abd36fa1b.tar.bz2
txr-9c804b7087e9b332b2cea738fbda493abd36fa1b.zip
compiler: implement return-from and return.
* share/txr/stdlib/compiler.tl (compiler compile): Handle return and return-from special forms. (compiler comp-return-from, compiler comp-return): New methods.
-rw-r--r--share/txr/stdlib/compiler.tl18
1 files changed, 18 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl
index e6f7acda..b01482b5 100644
--- a/share/txr/stdlib/compiler.tl
+++ b/share/txr/stdlib/compiler.tl
@@ -162,6 +162,8 @@
(cond me.(comp-cond oreg env form))
(if me.(comp-if oreg env form))
(block me.(comp-block oreg env form))
+ (return-from me.(comp-return-from oreg env form))
+ (return me.(comp-return oreg env form))
((let let*) me.(comp-let oreg env form))
(lambda me.(comp-lambda oreg env form))
(sys:for-op me.(comp-for oreg env form))
@@ -326,6 +328,22 @@
bfrag.fvars
bfrag.ffuns)))))
+(defmeth compiler comp-return-from (me oreg env form)
+ (mac-param-bind form (op name value) form
+ (let* ((nreg (if (null name)
+ nil
+ me.(get-dreg name)))
+ (vfrag me.(compile oreg env value)))
+ (new (frag oreg
+ ^(,*vfrag.code
+ (ret ,nreg ,vfrag.oreg))
+ vfrag.fvars
+ vfrag.ffuns)))))
+
+(defmeth compiler comp-return (me oreg env form)
+ (mac-param-bind form (op value) form
+ me.(comp-return-from oreg env ^(,op nil ,value))))
+
(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))