3 import StdList, StdInt, Data.Tuple, StdClass, iTasks._Framework.Generic, Text.JSON, Data.Functor, Control.Applicative, Control.Monad, Data.Void
4 import qualified iTasks
6 from Text import class Text, instance Text String
8 from StdTuple import fst
9 import qualified Data.Map as DM
11 import qualified Data.List as List
13 :: Element :== Stmt Int
15 :: Val = I Int | S [Int] | B Bool
16 :: State :== Map String Val
17 :: Sem a = Sem (State -> (Either String a, State))
18 :: Stmt a = {v :: Sem a, p :: [String]}
24 instance Functor Sem where
25 fmap :: (a -> b) (Sem a) -> Sem b
26 fmap f (Sem s) = Sem \st.let (a, st`) = s st in (fmap f a, st`)
28 instance Applicative Sem where
30 pure s = Sem \st.(pure s, st)
31 (<*>) infixl 4 :: (Sem (a -> b)) (Sem a) -> Sem b
34 instance Monad Sem where
35 bind :: (Sem a) (a -> Sem b) -> Sem b
36 bind (Sem s) f = Sem \st.case s st of
37 (Right v, st`) = let (Sem r) = f v in r st`
38 (Left e, st`) = (Left e, st`)
40 fail :: String -> Sem a
41 fail s = Sem \st.(Left s,st)
43 instance + Element where
44 (+) s1 s2 = {v=(+) <$> s1.v <*> s2.v, p=s1.p ++ ["+"] ++ s2.p}
45 instance - Element where
46 (-) s1 s2 = {v=(-) <$> s1.v <*> s2.v, p=s1.p ++ ["-"] ++ s2.p}
47 instance * Element where
48 (*) s1 s2 = {v=(*) <$> s1.v <*> s2.v, p=s1.p ++ ["*"] ++ s2.p}
50 integer :: Int -> Element
51 integer i = {v=return i, p=[toString i]}
53 size :: Set -> Element
54 size s = {v=length <$> s.v, p=["|":s.p++["|"]]}
57 new = {v=return [], p=["∅"]}
59 insert :: Element Set -> Set
60 insert e s = union {v=((\x.[x]) <$> e.v), p=["{":e.p++["}"]]} s
62 delete :: Element Set -> Set
63 delete e s = difference {v=((\x.[x]) <$> e.v), p=["{":e.p++["}"]]} s
65 union :: Set Set -> Set
66 union s1 s2 = {v='List'.union <$> s1.v <*> s2.v, p=s1.p++["∪":s2.p]}
68 difference :: Set Set -> Set
69 difference s1 s2 = {v='List'.difference <$> s1.v <*> s2.v, p=s1.p++["\\":s2.p]}
71 intersection :: Set Set -> Set
72 intersection s1 s2 = {v='List'.intersect <$> s1.v <*> s2.v, p=s1.p++["∩":s2.p]}
74 class variable a :: String -> a
76 instance variable Element where
77 variable k = {v=Sem \st.case 'DM'.get k st of
78 (Just (I v)) = (Right v, st)
79 (Just _) = (Left "Wrong type, expected Int", st)
80 _ = (Left ("Variable '"+++ k +++ "' not found"), st), p=[k]}
82 instance variable Set where
83 variable k = {v=Sem \st.case 'DM'.get k st of
84 (Just (S v)) = ((Right v), st)
85 (Just _) = (Left "Wrong type, expected Set", st)
86 _ = (Left ("Variable '" +++ k +++ "' not found"), st), p=[k]}
87 class (=.) infix 2 a :: String a -> a
89 instance =. Element where
90 (=.) k v = {v=Sem \st.let (Sem v`) = v.v in case v` st of
91 (Right v`, st) = (Right v`, 'DM'.put k (I v`) st)
92 (Left e, st) = (Left e, st), p=[k:[":=":v.p]]}
95 (=.) k v = {v=Sem \st.let (Sem v`) = v.v in case v` st of
96 (Right v`, st) = (Right v`, 'DM'.put k (S v`) st)
97 (Left e, st) = (Left e, st), p=[k:[":=":v.p]]}
99 (:.) infixl 1 :: (Stmt a) (Stmt b) -> (Stmt b)
100 (:.) s1 s2 = {v=s1.v >>| s2.v, p=s1.p ++ [";\n":s2.p]}
102 (==.) infix 4 :: (Stmt a) (Stmt a) -> (Stmt Bool) | == a
103 (==.) s1 s2 = {v=(==) <$> s1.v <*> s2.v, p=s1.p++["==":s2.p]}
105 (<.) infix 4 :: (Stmt a) (Stmt a) -> (Stmt Bool) | < a
106 (<.) s1 s2 = {v=(<) <$> s1.v <*> s2.v, p=s1.p++["<":s2.p]}
108 IF :: (Stmt Bool) THEN (Stmt a) ELSE (Stmt a) -> Stmt a
109 IF c _ t _ e = {v=c.v >>= \c`.if c` t.v e.v,
110 p=["IF ":c.p]++[" THEN\n":t.p]++ ["\nELSE\n":e.p] ++ ["\nFI"]}
112 WHILE :: (Stmt Bool) DO (Stmt a) -> Stmt Int
113 WHILE c _ b = {v=while c.v b.v, p=["WHILE ":c.p]++[" DO\n":b.p]++["\nOD"]}
115 while c b = c >>= \c`.if c` (((+) 1) <$> (b >>| while c b)) (return 0)
117 eval e = let (Sem ev) = e.v in let (_, st) = ev 'DM'.newMap in 'DM'.toList st
118 print e = 'Text'.concat e.p
121 //Start = eval expr10
127 expr2 = expr1 + expr1
130 expr3 = expr1 + expr1 * integer 3
133 expr4 = union new (insert expr1 (insert expr3 new))
142 x =. insert (integer 11) new :.
143 x =. size (variable x) :.
148 x =. insert (integer 11) new :.
153 x =. insert (integer 11) new :.
154 x =. insert (size (variable x)) (variable x) :.
159 x =. insert (integer 0) new :.
160 IF (size (variable x) ==. integer 0) THEN
161 (x =. insert (integer 0) (variable x))
163 (x =. delete (integer 0) (variable x)) :.
170 x =. insert (variable z) (variable x) :.
171 y =. union (variable x) (variable x) :.
172 WHILE (size (variable x) <. integer 5) DO
173 (x =. insert (size (variable x)) (variable x)) :.
174 z =. difference (variable x) (intersection (variable x) (insert (variable z) new))