diff options
author | dos-reis <gdr@axiomatics.org> | 2011-12-17 04:07:28 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2011-12-17 04:07:28 +0000 |
commit | 4d31a9261e5ed68302e68bf29bca95b0c8dee5f0 (patch) | |
tree | a16394531c729635fb9b925780e78a7fd38094a0 /src/interp/g-opt.boot | |
parent | e0238f5811dff267702803a1160282f92bc3fbdc (diff) | |
download | open-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.boot | 13 |
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 |