diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-22 06:27:27 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-22 06:27:27 -0700 |
commit | d65e7e675b50ea9fbbdd83f3aeffe919af907e5a (patch) | |
tree | bf76f3b81255dd89da16bc22af28717e4f9f33da /share | |
parent | 81e921e4089138589e317169a4e034bea4e219f5 (diff) | |
download | txr-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.tl | 18 |
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)) |