diff options
Diffstat (limited to 'paper/While')
-rw-r--r-- | paper/While/Common.dcl | 1 | ||||
-rw-r--r-- | paper/While/Common.icl | 3 | ||||
-rw-r--r-- | paper/While/Makefile | 11 | ||||
-rw-r--r-- | paper/While/Simple.dcl | 10 | ||||
-rw-r--r-- | paper/While/Simple.icl | 13 | ||||
-rw-r--r-- | paper/While/WhileCommon.dcl | 7 | ||||
-rw-r--r-- | paper/While/WhileCommon.icl | 37 |
7 files changed, 51 insertions, 31 deletions
diff --git a/paper/While/Common.dcl b/paper/While/Common.dcl index 6945c08..c2d58d4 100644 --- a/paper/While/Common.dcl +++ b/paper/While/Common.dcl @@ -32,6 +32,7 @@ instance toString Error (<+) infixr 5 :: a b -> String | toString a & toString b ($) infixr 0 :: (a -> b) a -> b +(on) infix 0 :: (b -> c) (a a -> b) -> (a a -> c) (*>) infixl 4 :: (f a) (f b) -> f b | Applicative f (<*) infixl 4 :: (f a) (f b) -> f a | Applicative f diff --git a/paper/While/Common.icl b/paper/While/Common.icl index 4f6e4c4..2c28933 100644 --- a/paper/While/Common.icl +++ b/paper/While/Common.icl @@ -28,6 +28,9 @@ where ($) infixr 0 :: (a -> b) a -> b ($) f x = f x +(on) infix 0 :: (b -> c) (a a -> b) -> (a a -> c) +(on) f g = \x y -> f (g x y) + (*>) infixl 4 :: (f a) (f b) -> f b | Applicative f (*>) fa fb = const id <$> fa <*> fb diff --git a/paper/While/Makefile b/paper/While/Makefile new file mode 100644 index 0000000..8125af0 --- /dev/null +++ b/paper/While/Makefile @@ -0,0 +1,11 @@ +CLM=clm +CLMFLAGS=-I $$CLEAN_HOME/lib/Generics +OBJ=SimpleTest + +all: $(OBJ) + +$(OBJ): %: $(wildcard *.icl) $(wildcard *.dcl) + $(CLM) $(CLMFLAGS) $@ -o $@ + +clean: + rm -rfv Clean\ System\ Files $(OBJ) diff --git a/paper/While/Simple.dcl b/paper/While/Simple.dcl index 5a08e85..df49964 100644 --- a/paper/While/Simple.dcl +++ b/paper/While/Simple.dcl @@ -3,11 +3,11 @@ definition module Simple from StdOverloaded import class toString import WhileCommon -:: Stm = Ass Var AExpr - | If BExpr Stm Stm - | While BExpr Stm - | Skip - | Compose Stm Stm +:: Stm = Ass Var AExpr + | If BExpr Stm Stm + | While BExpr Stm + | Skip + | Compose Stm Stm instance toString Stm instance run Stm diff --git a/paper/While/Simple.icl b/paper/While/Simple.icl index 4c226c9..7ef042f 100644 --- a/paper/While/Simple.icl +++ b/paper/While/Simple.icl @@ -15,15 +15,16 @@ where instance run Stm where - run (Ass v e) st - = pure (\w -> if (w==v) (eval e st) (st w)) - run (If b s1 s2) st + run :: Stm State -> Either Error State + run (Ass v e) st // Assign e to v + = pure (\w -> if (w == v) (eval e st) (st w)) + run (If b s1 s2) st // If b then s1 else s2 = eval b st >>= \r -> run (if r s1 s2) st - run w=:(While b s) st + run w=:(While b s) st // While b do s = eval b st >>= \r -> if r (run s st >>= run w) (pure st) - run Skip st + run Skip st // Skip = pure st - run (Compose s1 s2) st + run (Compose s1 s2) st // s1 ; s2 = run s1 st >>= run s2 diff --git a/paper/While/WhileCommon.dcl b/paper/While/WhileCommon.dcl index b813641..6d1c148 100644 --- a/paper/While/WhileCommon.dcl +++ b/paper/While/WhileCommon.dcl @@ -7,14 +7,15 @@ from WhileLexer import ::Token from Yard import ::Parser :: Var :== String - :: State :== Var -> Either Error Int +:: Operator = Add | Sub | Mul | Div + :: AExpr = Var Var | Lit Int | Op AExpr Operator AExpr -:: Operator = Add | Sub | Mul | Div +:: Comparator = Eq | Ne | Le | Lt | Ge | Gt :: BExpr = Bool Bool | Not BExpr @@ -22,8 +23,6 @@ from Yard import ::Parser | Or BExpr BExpr | Comp AExpr Comparator AExpr -:: Comparator = Eq | Ne | Le | Lt | Ge | Gt - derive gEq AExpr, Operator, BExpr, Comparator instance zero State diff --git a/paper/While/WhileCommon.icl b/paper/While/WhileCommon.icl index a76458f..ce4f8fe 100644 --- a/paper/While/WhileCommon.icl +++ b/paper/While/WhileCommon.icl @@ -9,7 +9,8 @@ import Yard derive gEq AExpr, Operator, BExpr, Comparator -instance zero State where zero = \v -> Left (Runtime "Undefined variable") +instance zero State +where zero = \v -> Left (Runtime "Undefined") instance toString AExpr where @@ -38,32 +39,36 @@ where instance eval AExpr Int where + eval :: AExpr State -> Either Error Int eval (Var v) st = st v - eval (Lit i) st = pure i - eval (Op a1 op a2) st = eval a1 st >>= \r1 -> eval a2 st >>= toOp op r1 + eval (Lit i) _ = pure i + eval (Op a1 op a2) st + = eval a1 st >>= \r1 -> + eval a2 st >>= app op r1 where - toOp :: Operator -> Int Int -> Either Error Int - toOp Add = \i j -> pure (i + j) - toOp Sub = \i j -> pure (i - j) - toOp Mul = \i j -> pure (i * j) - toOp Div = \i j -> - if (j == 0) (Left (Runtime "Division by 0")) (pure (i / j)) + app :: Operator -> Int Int -> Either Error Int + app Add = pure on (+) + app Sub = pure on (-) + app Mul = pure on (*) + app Div = \i j -> if (j == 0) + (Left (Runtime "Division by 0")) + (pure (i / j)) instance eval BExpr Bool where eval (Bool b) st = pure b - eval (Not b) st = eval b st >>= pure o not + eval (Not b) st = not <$> eval b st eval (And b1 b2) st = liftM2 (&&) (eval b1 st) (eval b2 st) eval (Or b1 b2) st = liftM2 (||) (eval b1 st) (eval b2 st) eval (Comp a1 cmp a2) st = liftM2 (toCmp cmp) (eval a1 st) (eval a2 st) where toCmp :: Comparator -> Int Int -> Bool - toCmp Eq = \i j -> i == j - toCmp Ne = \i j -> i <> j - toCmp Le = \i j -> i <= j - toCmp Lt = \i j -> i < j - toCmp Ge = \i j -> i >= j - toCmp Gt = \i j -> i > j + toCmp Eq = (==) + toCmp Ne = (<>) + toCmp Le = (<=) + toCmp Lt = (<) + toCmp Ge = (>=) + toCmp Gt = (>) pbexpr :: Parser Token BExpr pbexpr = liftM2 Or pbconj (item OrToken *> pbexpr) <|> pbconj |