+++ /dev/null
-implementation module while
-
-import StdEnv
-
-:: Gamma :== String -> Int
-instance gamma Gamma
-where
- put g i v = \i`->if (i == i`) v (g i)
- get g v = g v
-
-emptyGamma :: Gamma
-emptyGamma = abort "Undefined variable"
-
-instance eval WhileExpr
-where
- eval (i =. v) = \g->put g i (evali v g)
- eval (If b _ t _ e) = \g->if (evalb b g) (eval t g) (eval e g)
- eval (a :. b) = eval b o eval a
- eval x=:(While b _ e) = \g->if (evalb b g) (eval (e :. x) g) g
- eval Skip = id
- eval (WExpr e) = eval e
-
-instance evali WhileInt
-where
- evali (Int i) = const i
- evali (Var s) = flip get s
- evali (a +. b) = \g->evali a g + evali b g
- evali (WInt e) = evali e
-
-instance evalb WhileBool
-where
- evalb (Bool b) = const b
- evalb (a ==. b) = \g->evali a g == evali b g
- evalb (a &. b) = \g->evalb a g && evalb b g
- evalb (Not a) = not o evalb a
- evalb (WBool e) = evalb e
-
-instance print WhileExpr
-where
- print (i =. v) = i +++ " := " +++ print v
- print (If b _ t _ e) = "If " +++ print b +++ " then " +++ print t +++ " else " +++ print e
- print (a :. b) = print a +++ "; " +++ print b
- print x=:(While b _ e) = "While " +++ print b +++ " do " +++ print e
- print Skip = "Skip"
- print (WExpr e) = print e
-
-instance print WhileInt
-where
- print (Int i) = toString i
- print (Var s) = s
- print (a +. b) = print a +++ " + " +++ print b
- print (WInt e) = print e
-
-instance print WhileBool
-where
- print (Bool b) = toString b
- print (a ==. b) = print a +++ " = " +++ print b
- print (a &. b) = print a +++ " && " +++ print b
- print (Not a) = "!" +++ print a
- print (WBool e) = print e
-
-Start = (eval ("a" =. Int 42 :. While (Bool False) Do ("b" =. Int 4)) emptyGamma) "a"