new a10A
[clean-tests.git] / afp / a9 / a9.icl
index 5614d69..d89b07b 100644 (file)
@@ -219,10 +219,14 @@ logical :: Logical -> Stmt
 logical e = {evaluator = e.evaluator *> pure (), printer = e.printer}
 
 For :: String Set Stmt -> Stmt
-For i e s =
-       { evaluator = (i =. e).evaluator *> s.evaluator
-       , printer   = \c->["For",i,"=":e.printer ["In":s.printer c]]
+For ident bag body =
+       { evaluator = bag.evaluator >>= \v->
+               foldr proc (pure ()) [ident =. integer e\\e<-v]
+       , printer   = \c->["For",ident,"=":bag.printer ["In":body.printer c]]
        }
+where
+       proc :: (Sem Int) (StateT SemState (Either String) ()) -> StateT SemState (Either String) ()
+       proc e m = e.evaluator *> body.evaluator *> m
 
 If :: Logical Stmt Stmt -> Stmt
 If l s1 s2 =