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