aboutsummaryrefslogtreecommitdiff
path: root/src/interp/i-spec1.boot
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp/i-spec1.boot')
-rw-r--r--src/interp/i-spec1.boot39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/interp/i-spec1.boot b/src/interp/i-spec1.boot
index 4164d514..ca70e66e 100644
--- a/src/interp/i-spec1.boot
+++ b/src/interp/i-spec1.boot
@@ -460,6 +460,7 @@ upCOLLECT1 t ==
putTarget(body,S)
$interpOnly => interpCOLLECT(op,itrl,body)
isStreamCollect itrl => collectStream(t,op,itrl,body)
+ $iteratorVars: local := nil
upLoopIters itrl
ms:= bottomUpCompile body
[m]:= ms
@@ -516,7 +517,7 @@ upLoopIterIN(iter,index,s) ==
iterMs isnt [['List,ud]] => throwKeyedMsg("S2IS0006",[index])
put(index,'mode,ud,$env)
- mkLocalVar('"the iterator expression",index)
+ mkIteratorVariable index
upLoopIterSTEP(index,lower,step,upperList) ==
null IDENTP index => throwKeyedMsg("S2IS0005",[index])
@@ -536,7 +537,7 @@ upLoopIterSTEP(index,lower,step,upperList) ==
else types := [stype, :types]
type := resolveTypeListAny removeDuplicates types
put(index,'mode,type,$env)
- mkLocalVar('"the iterator expression",index)
+ mkIteratorVariable index
evalCOLLECT(op,[:itrl,body],m) ==
iters := [evalLoopIter itr for itr in itrl]
@@ -690,7 +691,7 @@ upStreamIterIN(iter,index,s) ==
and (iterMs isnt [['InfinitTuple, ud]]) =>
throwKeyedMsg("S2IS0006",[index])
put(index,'mode,ud,$env)
- mkLocalVar('"the iterator expression",index)
+ mkIteratorVariable index
s :=
iterMs is [['List,ud],:.] =>
form:=[mkAtreeNode 'pretend, [mkAtreeNode 'COERCE,s,['Stream,ud]],
@@ -711,7 +712,7 @@ upStreamIterSTEP(index,lower,step,upperList) ==
put(index,'mode,type := resolveTT(ltype,stype),$env)
null type => throwKeyedMsg("S2IS0010", nil)
- mkLocalVar('"the iterator expression",index)
+ mkIteratorVariable index
s :=
null upperList =>
@@ -738,7 +739,7 @@ collectOneStream(t,op,itrl,body) ==
-- build stream collect for case of iterating over a single stream
-- In this case we don't need to build records
form := mkAndApplyPredicates itrl
- bodyVec := mkIterFun(first $indexVars,body,$localVars)
+ bodyVec := mkIterFun(first $indexVars,body)
form := [mkAtreeNode 'map,bodyVec,form]
bottomUp form
val := getValue form
@@ -756,20 +757,20 @@ mkAndApplyPredicates itrl ==
for iter in itrl repeat
iter is ['WHILE,pred] =>
fun := 'filterWhile
- predVec := mkIterFun(indSet,pred,$localVars)
+ predVec := mkIterFun(indSet,pred)
s := [mkAtreeNode fun,predVec,s]
iter is ['UNTIL,pred] =>
fun := 'filterUntil
- predVec := mkIterFun(indSet,pred,$localVars)
+ predVec := mkIterFun(indSet,pred)
s := [mkAtreeNode fun,predVec,s]
iter is ['SUCHTHAT,pred] =>
fun := 'select
putTarget(pred,$Boolean)
- predVec := mkIterFun(indSet,pred,$localVars)
+ predVec := mkIterFun(indSet,pred)
s := [mkAtreeNode fun,predVec,s]
s
-mkIterFun([index,:s],funBody,$localVars) ==
+mkIterFun([index,:s],funBody) ==
-- transform funBody into a lambda with index as the parameter
mode := objMode getValue s
mode isnt ['Stream, indMode] and mode isnt ['InfiniteTuple, indMode] =>
@@ -778,13 +779,14 @@ mkIterFun([index,:s],funBody,$localVars) ==
mkLocalVar($mapName,index)
[m]:=bottomUpCompile funBody
mapMode := ['Mapping,m,indMode]
+ -- Check generated code for free variables and pass them into the
+ -- lambda as part of envArg. Since only `index' is bound, every
+ -- other symbol in non-operator position is a free variable.
$freeVariables: local := []
$boundVariables: local := [index]
- -- CCL does not support upwards funargs, so we check for any free variables
- -- and pass them into the lambda as part of envArg.
- body := checkForFreeVariables(getValue funBody,$localVars)
+ body := checkForFreeVariables(objVal getValue funBody,"ALL")
parms := [index,"envArg"]
- val:=['function,['LAMBDA,parms,:declareUnusedParameters(parms,objVal body)]]
+ val:=['function,['LAMBDA,parms,:declareUnusedParameters(parms,body)]]
vec := mkAtreeNode gensym()
putValue(vec,objNew(['CONS,val,["VECTOR",:reverse $freeVariables]],mapMode))
vec
@@ -1146,7 +1148,7 @@ declare(var,mode) ==
nargs ~= #args => throwKeyedMsg("S2IM0008",[var])
if $compilingMap then mkLocalVar($mapName,var)
else clearDependencies(var,true)
- isLocalVar(var) => put(var,'mode,mode,$env)
+ isLocallyBound var => put(var,'mode,mode,$env)
mode is ['Mapping,:.] => declareMap(var,mode)
v := get(var,'value,$e) =>
-- only allow this if either
@@ -1168,7 +1170,8 @@ getAndEvalConstructorArgument tree ==
triple := getValue tree
objMode triple = '(Domain) => triple
isWrapped objVal(triple) => triple
- isLocalVar objVal triple => compFailure('" Local variable or parameter used in type")
+ isLocallyBound objVal triple =>
+ compFailure('" Local variable or parameter used in type")
objNewWrap(timedEVALFUN objVal(triple), objMode(triple))
replaceSharps(x,d) ==
@@ -1262,3 +1265,9 @@ deleteAll(x,l) ==
x = first(l) => deleteAll(x,rest l)
[first l,:deleteAll(x,rest l)]
+
+$iteratorVars := nil
+
+mkIteratorVariable id ==
+ $iteratorVars := [id,:$iteratorVars]
+ -- mkLocalVar('"the iterator expression",id)