summaryrefslogtreecommitdiffstats
path: root/share
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
commitd65e7e675b50ea9fbbdd83f3aeffe919af907e5a (patch)
treebf76f3b81255dd89da16bc22af28717e4f9f33da /share
parent81e921e4089138589e317169a4e034bea4e219f5 (diff)
downloadtxr-d65e7e675b50ea9fbbdd83f3aeffe919af907e5a.tar.gz
txr-d65e7e675b50ea9fbbdd83f3aeffe919af907e5a.tar.bz2
txr-d65e7e675b50ea9fbbdd83f3aeffe919af907e5a.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.
Diffstat (limited to 'share')
-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))