diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-26 06:18:09 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-26 06:18:09 -0700 |
commit | 5897492b4cb4c906efe21246facf6f46fbcc8ff9 (patch) | |
tree | 61d59201bedc4c8fcc887d02a487fee479734a45 /share | |
parent | 40833b9787ab986908147a00ebf6561751bb8d74 (diff) | |
download | txr-5897492b4cb4c906efe21246facf6f46fbcc8ff9.tar.gz txr-5897492b4cb4c906efe21246facf6f46fbcc8ff9.tar.bz2 txr-5897492b4cb4c906efe21246facf6f46fbcc8ff9.zip |
compiler: implement block* special form.
* share/txr/stdlib/compiler.tl (compiler compile): Route
block* to same helper method as block.
(compiler comp-block): Handle block* also by compiling the
name form and using the resulting value as the name
operand in the block instruction.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/compiler.tl | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index f2614f77..f1ccccd4 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -175,7 +175,7 @@ (cond me.(comp-cond oreg env form)) (if me.(comp-if oreg env form)) (unwind-protect me.(comp-unwind-protect oreg env form)) - (block me.(comp-block oreg env form)) + ((block 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)) @@ -428,11 +428,14 @@ (defmeth compiler comp-block (me oreg env form) (mac-param-bind form (op name . body) form - (let* ((nreg (if name me.(get-dreg name) '(t 0))) + (let* ((star (and name (eq op 'block*))) + (nfrag (if star me.(compile oreg env name))) + (nreg (if star nfrag.oreg me.(get-dreg name))) (bfrag me.(comp-progn oreg env body)) (lskip (gensym "l"))) (new (frag oreg - ^((block ,oreg ,nreg ,lskip) + ^(,*(if nfrag nfrag.code) + (block ,oreg ,nreg ,lskip) ,*bfrag.code (end ,bfrag.oreg) ,lskip) |