aboutsummaryrefslogtreecommitdiff
path: root/src/interp/g-opt.boot
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2011-12-17 04:07:28 +0000
committerdos-reis <gdr@axiomatics.org>2011-12-17 04:07:28 +0000
commit4d31a9261e5ed68302e68bf29bca95b0c8dee5f0 (patch)
treea16394531c729635fb9b925780e78a7fd38094a0 /src/interp/g-opt.boot
parente0238f5811dff267702803a1160282f92bc3fbdc (diff)
downloadopen-axiom-4d31a9261e5ed68302e68bf29bca95b0c8dee5f0.tar.gz
* interp/g-opt.boot (freeIteratorFirstValues): New.
(cleanLoop!): Use it. * interp/lisp-backend.boot ($freeVarName): Remove. (loopVarInit): Do not generate initializer for free iterators. Adjust callers. (massageFreeVarInits): Remove. Adjust caller.
Diffstat (limited to 'src/interp/g-opt.boot')
-rw-r--r--src/interp/g-opt.boot13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/interp/g-opt.boot b/src/interp/g-opt.boot
index c93204bc..e529d56f 100644
--- a/src/interp/g-opt.boot
+++ b/src/interp/g-opt.boot
@@ -345,10 +345,21 @@ removeLeave! x == walkWith!(x,function f) where
x is ['%leave,.,y] and y is ['%return,:.] => resetTo(x,y)
x
+freeIteratorFirstValues iters ==
+ [u for it in iters | u := f it] where
+ f it ==
+ it is ['STEP,['%free,:id],lo,:.] => ['%LET,id,lo]
+ it is ['ON,['%free,:id],l] => ['%LET,id,l]
+ nil
+
cleanLoop! x == prefixWalk!(x,function f) where
f x ==
x is ['%scope,tag,['%repeat,:itl,body,val]] =>
- resetTo(x,f ['%repeat,:itl,g(body,tag),g(val,tag)])
+ body := g(body,tag)
+ val := g(val,tag)
+ firstVals := freeIteratorFirstValues itl =>
+ resetTo(x,mkSeq [:firstVals,f ['%repeat,:itl,body,val]])
+ resetTo(x,f ['%repeat,:itl,body,val])
x
g(x,tag) ==
atomic? x => x