From 9c804b7087e9b332b2cea738fbda493abd36fa1b Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 22 Mar 2018 06:27:27 -0700 Subject: 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. --- share/txr/stdlib/compiler.tl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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)) -- cgit v1.2.3