a8 done
[ap2015.git] / a8 / mart / skeleton8_without_printing.icl
1 module skeleton8
2
3 import StdList, StdInt, Data.Tuple, StdClass, iTasks._Framework.Generic, Text.JSON, Data.Functor, Control.Applicative, Control.Monad, Data.Void
4 import qualified iTasks
5 import qualified Text
6 from Text import class Text, instance Text String
7 from StdFunc import o
8 from StdTuple import fst
9 from Data.Map import :: Map, put, get, newMap
10 import Data.Either
11 import qualified Data.List as List
12
13 :: Element :== Sem Int
14 :: Set :== Sem [Int]
15 :: Val = I Int | S [Int] | B Bool
16 :: State :== Map String Val
17 :: Sem a = Sem (State -> (Either String a, State))
18
19 instance Functor Sem where
20 fmap :: (a -> b) (Sem a) -> Sem b
21 fmap f (Sem s) = Sem \st.let (a, st`) = s st in (fmap f a, st`)
22
23 instance Applicative Sem where
24 pure :: a -> Sem a
25 pure s = Sem \st.(pure s, st)
26 (<*>) infixl 4 :: (Sem (a -> b)) (Sem a) -> Sem b
27 (<*>) a f = ap a f
28
29 instance Monad Sem where
30 bind :: (Sem a) (a -> Sem b) -> Sem b
31 bind (Sem s) f = Sem \st.case s st of
32 (Right v, st`) = let (Sem r) = f v in r st`
33 (Left e, st`) = (Left e, st`)
34
35 fail :: String -> Sem a
36 fail s = Sem \st.(Left s,st)
37
38 instance + Element where (+) s1 s2 = (+) <$> s1 <*> s2
39 instance - Element where (-) s1 s2 = (-) <$> s1 <*> s2
40 instance * Element where (*) s1 s2 = (*) <$> s1 <*> s2
41
42 integer :: Int -> Element
43 integer i = return i
44
45 size :: Set -> Element
46 size s = length <$> s
47
48 new :: Set
49 new = return []
50
51 insert :: Element Set -> Set
52 insert e s = union ((\x.[x]) <$> e) s
53
54 delete :: Element Set -> Set
55 delete e s = difference ((\x.[x]) <$> e) s
56
57 union :: Set Set -> Set
58 union s1 s2 = fmap 'List'.union s1 <*> s2
59
60 difference :: Set Set -> Set
61 difference s1 s2 = fmap 'List'.difference s1 <*> s2
62
63 intersection :: Set Set -> Set
64 intersection s1 s2 = fmap 'List'.intersect s1 <*> s2
65
66 class eval a :: (Sem a) -> (Either String a, State)
67
68 instance eval Element where
69 eval (Sem e) = e newMap
70
71 instance eval Set where
72 eval (Sem s) = s newMap
73
74 instance eval Int where
75 eval (Sem s) = s newMap
76
77 instance eval [Int] where
78 eval (Sem s) = s newMap
79
80 class variable a :: String -> a
81
82 instance variable Element where
83 variable k = Sem \st.case get k st of
84 (Just (I v)) = (Right v, st)
85 (Just _) = (Left "Wrong type, expected Int", st)
86 _ = (Left "Variable not found", st)
87
88 instance variable Set where
89 variable k = Sem \st.case get k st of
90 (Just (S v)) = ((Right v), st)
91 (Just _) = (Left "Wrong type, expected Set", st)
92 _ = (Left "Variable not found", st)
93
94 class (=.) infix 2 a :: String a -> a
95
96 instance =. Element where
97 (=.) k (Sem v) = Sem \st.case v st of
98 (Right v, st) = (Right v, put k (I v) st)
99 (Left e, st) = (Left e, st)
100
101 instance =. Set where
102 (=.) k (Sem v) = Sem \st.case v st of
103 (Right v, st) = (Right v, put k (S v) st)
104 (Left e, st) = (Left e, st)
105
106 (:.) infixl 1 :: (Sem a) (Sem b) -> (Sem b)
107 (:.) s1 s2 = s1 >>| s2
108
109 (==.) infix 4 :: (Sem a) (Sem a) -> (Sem Bool) | == a
110 (==.) s1 s2 = fmap (==) s1 <*> s2
111
112 (<.) infix 4 :: (Sem a) (Sem a) -> (Sem Bool) | < a
113 (<.) s1 s2 = fmap (<) s1 <*> s2
114
115 IF :: (Sem Bool) THEN (Sem a) ELSE (Sem a) -> Sem a
116 IF c _ t _ e = c >>= \c.if c t e
117
118 WHILE :: (Sem Bool) DO (Sem a) -> Sem Int
119 WHILE c _ b = c >>= \c`.if c` (fmap ((+) 1) (b >>| WHILE c DO b)) (return 0)
120
121 :: THEN = THEN
122 :: ELSE = ELSE
123 :: DO = DO
124
125 // examples
126 expr1 :: Element
127 expr1 = integer 2
128
129 expr2 :: Element
130 expr2 = expr1 + expr1
131
132 expr3 :: Element
133 expr3 = expr1 + expr1 * integer 3
134
135 expr4 :: Set
136 expr4 = union new (insert expr1 (insert expr3 new))
137
138 expr5 :: Set
139 expr5 =
140 x =. expr4 :.
141 variable x
142
143 expr6 :: Element
144 expr6 =
145 x =. insert (integer 11) new :.
146 x =. size (variable x) :.
147 variable x
148
149 expr7 :: Set
150 expr7 =
151 x =. insert (integer 11) new :.
152 y =. variable x
153
154 expr8 :: Set
155 expr8 =
156 x =. insert (integer 11) new :.
157 x =. insert (size (variable x)) (variable x) :.
158 variable x
159
160 expr9 :: Set
161 expr9 =
162 x =. insert (integer 0) new :.
163 IF (size (variable x) ==. integer 0) THEN
164 (x =. insert (integer 0) (variable x))
165 ELSE
166 (x =. delete (integer 0) (variable x)) :.
167 variable x
168
169 expr10 :: Set
170 expr10 =
171 z =. integer 7 :.
172 x =. new :.
173 x =. insert (variable z) (variable x) :.
174 y =. union (variable x) (variable x) :.
175 WHILE (size (variable x) <. integer 5) DO
176 (x =. insert (size (variable x)) (variable x)) :.
177 z =. difference (variable x) (intersection (variable x) (insert (variable z) new))
178
179 x = "x"
180 y = "y"
181 z = "z"
182
183 Start = expr10