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