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 =