From 4d31a9261e5ed68302e68bf29bca95b0c8dee5f0 Mon Sep 17 00:00:00 2001 From: dos-reis Date: Sat, 17 Dec 2011 04:07:28 +0000 Subject: * 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. --- src/interp/g-opt.boot | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/interp/g-opt.boot') 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 -- cgit v1.2.3