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