1 implementation module while
5 :: Gamma :== String -> Int
8 put g i v = \i`->if (i == i`) v (g i)
12 emptyGamma = abort "Undefined variable"
14 instance eval WhileExpr
16 eval (i =. v) = \g->put g i (evali v g)
17 eval (If b _ t _ e) = \g->if (evalb b g) (eval t g) (eval e g)
18 eval (a :. b) = eval b o eval a
19 eval x=:(While b _ e) = \g->if (evalb b g) (eval (e :. x) g) g
21 eval (WExpr e) = eval e
23 instance evali WhileInt
25 evali (Int i) = const i
26 evali (Var s) = flip get s
27 evali (a +. b) = \g->evali a g + evali b g
28 evali (WInt e) = evali e
30 instance evalb WhileBool
32 evalb (Bool b) = const b
33 evalb (a ==. b) = \g->evali a g == evali b g
34 evalb (a &. b) = \g->evalb a g && evalb b g
35 evalb (Not a) = not o evalb a
36 evalb (WBool e) = evalb e
38 instance print WhileExpr
40 print (i =. v) = i +++ " := " +++ print v
41 print (If b _ t _ e) = "If " +++ print b +++ " then " +++ print t +++ " else " +++ print e
42 print (a :. b) = print a +++ "; " +++ print b
43 print x=:(While b _ e) = "While " +++ print b +++ " do " +++ print e
45 print (WExpr e) = print e
47 instance print WhileInt
49 print (Int i) = toString i
51 print (a +. b) = print a +++ " + " +++ print b
52 print (WInt e) = print e
54 instance print WhileBool
56 print (Bool b) = toString b
57 print (a ==. b) = print a +++ " = " +++ print b
58 print (a &. b) = print a +++ " && " +++ print b
59 print (Not a) = "!" +++ print a
60 print (WBool e) = print e
62 Start = (eval ("a" =. Int 42 :. While (Bool False) Do ("b" =. Int 4)) emptyGamma) "a"