-
[clean-tests.git] / old / expr / exist / while.icl
1 implementation module while
2
3 import StdEnv
4
5 :: Gamma :== String -> Int
6 instance gamma Gamma
7 where
8 put g i v = \i`->if (i == i`) v (g i)
9 get g v = g v
10
11 emptyGamma :: Gamma
12 emptyGamma = abort "Undefined variable"
13
14 instance eval WhileExpr
15 where
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
20 eval Skip = id
21 eval (WExpr e) = eval e
22
23 instance evali WhileInt
24 where
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
29
30 instance evalb WhileBool
31 where
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
37
38 instance print WhileExpr
39 where
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
44 print Skip = "Skip"
45 print (WExpr e) = print e
46
47 instance print WhileInt
48 where
49 print (Int i) = toString i
50 print (Var s) = s
51 print (a +. b) = print a +++ " + " +++ print b
52 print (WInt e) = print e
53
54 instance print WhileBool
55 where
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
61
62 Start = (eval ("a" =. Int 42 :. While (Bool False) Do ("b" =. Int 4)) emptyGamma) "a"