added sds operators, timing and task deletion
[mTask.git] / mTaskInterpret.dcl
1 definition module mTaskInterpret
2
3 from Data.Functor.Identity import :: Identity
4 from Control.Monad.State import :: State, :: StateT
5 import mTask
6
7 :: BC
8 = BCNop
9 | BCPush Int
10 | BCPop
11 //SDS functions
12 | BCSdsStore Int
13 | BCSdsFetch Int
14 | BCSdsPublish Int
15 //Unary ops
16 | BCNot
17 //Binary Int ops
18 | BCAdd
19 | BCSub
20 | BCMul
21 | BCDiv
22 //Binary Bool ops
23 | BCAnd
24 | BCOr
25 | BCEq
26 | BCNeq
27 | BCLes
28 | BCGre
29 | BCLeq
30 | BCGeq
31 //Conditionals and jumping
32 | BCJmp Int
33 | BCJmpT Int
34 | BCJmpF Int
35 //Serial
36 | BCSerialAvail
37 | BCSerialPrint
38 | BCSerialPrintln
39 | BCSerialRead
40 | BCSerialParseInt
41 //Pins
42 | BCAnalogRead Pin
43 | BCAnalogWrite Pin
44 | BCDigitalRead Pin
45 | BCDigitalWrite Pin
46 | BCTest AnalogPin
47
48 //:: ByteCode a p = BC (BCState -> ([BC], BCState))
49 :: ByteCode a p = BC [BC]
50 //:: ByteCode a p = BC ((ReadWrite (ByteCode a Expr)) BCState -> ([BC], BCState))
51 :: BCState = {
52 a::()
53 }
54
55 class toByteCode a :: a -> [Char]
56 instance toByteCode Int
57 instance toByteCode Bool
58 instance toByteCode Char
59 instance toByteCode String
60 instance toByteCode Long
61 instance toByteCode Button
62
63 toByteVal :: BC -> [Char]
64 toReadableByteVal :: BC -> String
65
66 //instance toCode Pin
67 //instance toCode MTask
68 //instance toCode ()
69 //instance toCode Long
70 //
71 //class toCode a :: a -> String
72 //instance toCode Bool
73 //instance toCode Int
74 //instance toCode Real
75 //instance toCode Char
76 //instance toCode String
77 //instance toCode DigitalPin
78 //instance toCode AnalogPin
79 //
80 //argType :: (((Code a p)->Code b q)->In ((Code a p)->Code b q) (Code c s)) -> a | type a
81 //
82 //class argTypes t :: ((t->Code b Expr)->In (t->Code b2 q) (Main (Code c s))) -> t
83 //instance argTypes (Code a p) | showType a
84 //instance argTypes (Code a p, Code b q) | showType a & showType b
85 //instance argTypes (Code a p, Code b q, Code c r) | showType a & showType b & showType c
86 //
87 //instance toCode (SV t)
88 //
89 //instance arith Code
90 //instance boolExpr Code
91 //instance If Code Stmt Stmt Stmt
92 //instance If Code e Stmt Stmt
93 //instance If Code Stmt e Stmt
94 //instance If Code x y Expr
95 //instance IF Code
96 //instance sds Code
97 //
98 //defCode :: ((Code t p) -> In t (Main (Code u q))) -> Main (Code u r) | type t
99 //
100 //var :: String (ReadWrite (Code v q)) CODE -> CODE
101 //
102 //instance assign Code
103 //instance seq Code
104 //instance step` Code
105 //codeSteps :: [Step Code t] -> Code u p
106 //optBreak :: Mode -> Code u p
107 //
108 //instance setDelay Code
109 //instance mtask Code a | taskImp2 a & types a
110 //instance mtasks Code a b | taskImp2 a & types a & taskImp2 b & types b
111 //
112 //loopCode :: Int (Code a b) -> Code c d
113 //
114 //class taskImp2 a :: Int a -> ((Code Long p) a->Code MTask Expr, a) | /*long Code delay &*/ isExpr p
115 //instance taskImp2 ()
116 //instance taskImp2 (Code t p)
117 //instance taskImp2 (Code a p, Code b q)
118 //instance taskImp2 (Code a p, Code b q, Code c r)
119 //instance taskImp2 (Code a p, Code b q, Code c r, Code d s)
120 //
121 //class taskImp a :: Int a -> (Int a->Code MTask Expr, a)
122 //instance taskImp ()
123 //instance taskImp (Code t p)
124 //instance taskImp (Code a p, Code b q)
125 //instance taskImp (Code a p, Code b q, Code c r)
126 //instance taskImp (Code a p, Code b q, Code c r, Code d s)
127 //
128 //tasksMain :: Int Int ((a->Code MTask Expr,b->Code MTask Expr) -> In (a->Code c d,b->Code e f) (Main (Code g h))) -> Main (Code i j) | taskImp a & types a & taskImp b & types b
129 //class types a :: a
130 //instance types ()
131 //instance types (Code a p) | typeSelector a & isExpr p
132 //instance types (Code a p, Code b q) | typeSelector a & isExpr p & typeSelector b & isExpr q
133 //instance types (Code a p, Code b q, Code c r) | typeSelector a & isExpr p & typeSelector b & isExpr q & typeSelector c & isExpr r
134 //instance types (Code a p, Code b q, Code c r, Code d s) | typeSelector a & isExpr p & typeSelector b & isExpr q & typeSelector c & isExpr r & typeSelector d & isExpr s
135 //
136 //codeMTaskBody :: (Code v w) (Code c d) -> Code e f
137 //instance fun Code ()
138 //instance fun Code (Code t p) | type, showType t & isExpr p
139 //instance fun Code (Code a p, Code b q) | showType a & showType b
140 //instance fun Code (Code a p, Code b q, Code c r) | showType a & showType b & showType c
141 //instance output Code
142 //instance pinMode Code
143 //instance digitalIO Code
144 //instance dIO Code
145 //instance aIO Code
146 //instance analogIO Code
147 //instance noOp Code
148 //
149 //:: Code a p = C ((ReadWrite (Code a Expr)) CODE -> CODE)
150 //:: CODE =
151 // { fresh :: Int
152 // , freshMTask :: Int
153 // , funs :: [String]
154 // , ifuns :: Int
155 // , vars :: [String]
156 // , ivars :: Int
157 // , setup :: [String]
158 // , isetup :: Int
159 // , loop :: [String]
160 // , iloop :: Int
161 // , includes :: [String]
162 // , def :: Def
163 // , mode :: Mode
164 // , binds :: [String]
165 // }
166 //
167 //unC :: (Code a p) -> ((ReadWrite (Code a Expr)) CODE -> CODE)
168 //
169 //:: Def = Var | Fun | Setup | Loop
170 //:: Mode = /*MainMode |*/ NoReturn | Return String | SubExp | Assign String
171 //
172 //setMode :: Mode -> Code a p
173 //getMode :: (Mode -> Code a p) -> Code a p
174 //embed :: (Code a p) -> Code a p
175 //(+.+) infixl 5 :: (Code a p) (Code b q) -> Code c r
176 //fresh :: (Int -> (Code a p)) -> (Code a p)
177 //freshMTask :: (Int -> (Code a p)) -> (Code a p)
178 //setCode :: Def -> (Code a p)
179 //getCode :: (Def -> Code a p) -> (Code a p)
180 //brac :: (Code a p) -> Code b q
181 //funBody :: (Code a p) -> Code b q
182 //codeOp2 :: (Code a p) String (Code b q) -> Code c r
183 //include :: String -> Code a b
184 //argList :: [a] -> String | toCode a
185 //c :: a -> Code b p | toCode a
186 //indent :: Code a p
187 //unindent :: Code a p
188 //nl :: Code a p
189 //setBinds :: [String] -> Code a p
190 //addBinds :: String -> Code a p
191 //getBinds :: ([String] -> Code a p) -> (Code a p)
192 //
193 //// ----- driver ----- //
194 //
195 //compile :: (Main (Code a p)) -> [String]
196 //mkset :: [a] -> [a] | Eq a
197 //newCode :: CODE