aboutsummaryrefslogtreecommitdiff
path: root/src/interp/iterator.boot
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2008-05-11 19:14:29 +0000
committerdos-reis <gdr@axiomatics.org>2008-05-11 19:14:29 +0000
commit20e1bed66399cce629d08a71ca0552ed24fef1d1 (patch)
tree000ab5b98e479d1c077fc4f6fd4a9f46c4a9451c /src/interp/iterator.boot
parent51422a0c6bc0128cd5635a01c402ef56ad4ed770 (diff)
downloadopen-axiom-20e1bed66399cce629d08a71ca0552ed24fef1d1.tar.gz
Restrict loop variable scopes, take 2.
* interp/iterator.boot (compReduce1): Maintain proper scope for loop variables. (compRepeatOrCollect): Really maintain proper scope for loop variables. * interp/compiler.boot (eltModemapFilter): Highlight faulty selector. (seteltModemapFilter): Likewise. * interp/c-util.boot (stackMessage): Don't build message if there is no argument for substitution. * algebra/aggcat.spad.pamphlet (#$UnaryRecursiveAggregate): Declare free loop variable. (cycleEntry$UnaryRecursiveAggregate): Likewise. (cycleLength): Likewise. (merge$OneDimensionalArrayAggregate): Likewise. (delete$OneDimensionalArrayAggregate): Likewise. (position$ListAggregate): Likewise. * algebra/array1.spad.pamphlet (merge!$IndexedFlexibleArray): Likewise. * algebra/combfunc.spad.pamphlet (K2fact$CombinatorialFunction): Likewise. * algebra/curve.spad.pamphlet (nonSingularModel$FunctionFieldCategory): Likewise. * algebra/dpolcat.spad.pamphlet (differentiate$DifferentialPolynomialCategory): Likewise. * algebra/efstruc.spad.pamphlet (validExponential$ElementaryFunctionStructurePackage): Likewise. (ker2explogs$InnerTrigonometricManipulations): Likewise. (complexNormalize$TrigonometricManipulations): Likewise.
Diffstat (limited to 'src/interp/iterator.boot')
-rw-r--r--src/interp/iterator.boot16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/interp/iterator.boot b/src/interp/iterator.boot
index d62f4939..19ead302 100644
--- a/src/interp/iterator.boot
+++ b/src/interp/iterator.boot
@@ -45,10 +45,11 @@ compReduce1(form is ["REDUCE",op,.,collectForm],m,e,$formalArgList) ==
if STRINGP op then op:= INTERN op
^MEMQ(collectOp,'(COLLECT COLLECTV COLLECTVEC)) =>
systemError ["illegal reduction form:",form]
- $sideEffectsList: local
- $until: local
- $initList: local
- $endTestList: local
+ $sideEffectsList: local := nil
+ $until: local := nil
+ $initList: local := nil
+ $endTestList: local := nil
+ oldEnv := e
$e:= e
itl:= [([.,$e]:= compIterator(x,$e) or return "failed").(0) for x in itl]
itl="failed" => return nil
@@ -73,7 +74,7 @@ compReduce1(form is ["REDUCE",op,.,collectForm],m,e,$formalArgList) ==
if $until then
[untilCode,.,e]:= comp($until,$Boolean,e)
finalCode:= substitute(["UNTIL",untilCode],'$until,finalCode)
- [finalCode,m,e]
+ [finalCode,m,oldEnv]
++ returns the identity element of the `reduction' operation `x'
++ over a list -- a monoid homomorphism.
@@ -93,6 +94,7 @@ compRepeatOrCollect(form,m,e) ==
,e) where
fn(form,$exitModeStack,$leaveLevelStack,$formalArgList,e) ==
$until: local
+ oldEnv := e
[repeatOrCollect,:itl,body]:= form
itl':=
[([x',e]:= compIterator(x,e) or return "failed"; x') for x in itl]
@@ -135,7 +137,7 @@ compRepeatOrCollect(form,m,e) ==
T := coerceExit([form',m'',e'],targetMode) or return nil
-- iterator variables and other variables declared in
-- in a loop are local to the loop.
- [T.expr,T.mode,e]
+ [T.expr,T.mode,oldEnv]
--constructByModemap([x,source,e],target) ==
-- u:=
@@ -213,7 +215,7 @@ compIterator(it,e) ==
it is ["WHILE",p] =>
[p',m,e]:=
comp(p,$Boolean,e) or return
- stackMessage('"WHILE operand: %1 is not Boolean valued",[p])
+ stackMessage('"WHILE operand: %1b is not Boolean valued",[p])
[["WHILE",p'],e]
it is ["UNTIL",p] => ($until:= p; ['$until,e])
it is ["|",x] =>