diff options
-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)) |