summaryrefslogtreecommitdiff
path: root/paper/While
diff options
context:
space:
mode:
Diffstat (limited to 'paper/While')
-rw-r--r--paper/While/Common.dcl1
-rw-r--r--paper/While/Common.icl3
-rw-r--r--paper/While/Makefile11
-rw-r--r--paper/While/Simple.dcl10
-rw-r--r--paper/While/Simple.icl13
-rw-r--r--paper/While/WhileCommon.dcl7
-rw-r--r--paper/While/WhileCommon.icl37
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