X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=afp%2Fa9%2Fa9.icl;h=d89b07b82461508ab500c9a82cc73a8a43c2256a;hb=9d093d11da012724253e1a3b31d3f1af94b4e1bd;hp=5614d698abf5495b5616a0d48472f285c4a85189;hpb=598b249accfd4133e93013d52c7df4e217598383;p=clean-tests.git diff --git a/afp/a9/a9.icl b/afp/a9/a9.icl index 5614d69..d89b07b 100644 --- a/afp/a9/a9.icl +++ b/afp/a9/a9.icl @@ -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 =