Initial try, maybe I'll need a state
[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 | BCNeg
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
33 //:: ByteCode a p = BC (BCState -> ([BC], BCState))
34 :: ByteCode a p = BC [BC]
35 //:: ByteCode a p = BC ((ReadWrite (ByteCode a Expr)) BCState -> ([BC], BCState))
36 :: BCState = {
37 a::()
38 }
39
40 toByteVal :: BC -> String
41 toReadableByteVal :: BC -> String
42
43 //instance toCode Pin
44 //instance toCode MTask
45 //instance toCode ()
46 //instance toCode Long
47 //
48 //class toCode a :: a -> String
49 //instance toCode Bool
50 //instance toCode Int
51 //instance toCode Real
52 //instance toCode Char
53 //instance toCode String
54 //instance toCode DigitalPin
55 //instance toCode AnalogPin
56 //
57 //argType :: (((Code a p)->Code b q)->In ((Code a p)->Code b q) (Code c s)) -> a | type a
58 //
59 //class argTypes t :: ((t->Code b Expr)->In (t->Code b2 q) (Main (Code c s))) -> t
60 //instance argTypes (Code a p) | showType a
61 //instance argTypes (Code a p, Code b q) | showType a & showType b
62 //instance argTypes (Code a p, Code b q, Code c r) | showType a & showType b & showType c
63 //
64 //instance toCode (SV t)
65 //
66 //instance arith Code
67 //instance boolExpr Code
68 //instance If Code Stmt Stmt Stmt
69 //instance If Code e Stmt Stmt
70 //instance If Code Stmt e Stmt
71 //instance If Code x y Expr
72 //instance IF Code
73 //instance sds Code
74 //
75 //defCode :: ((Code t p) -> In t (Main (Code u q))) -> Main (Code u r) | type t
76 //
77 //var :: String (ReadWrite (Code v q)) CODE -> CODE
78 //
79 //instance assign Code
80 //instance seq Code
81 //instance step` Code
82 //codeSteps :: [Step Code t] -> Code u p
83 //optBreak :: Mode -> Code u p
84 //
85 //instance setDelay Code
86 //instance mtask Code a | taskImp2 a & types a
87 //instance mtasks Code a b | taskImp2 a & types a & taskImp2 b & types b
88 //
89 //loopCode :: Int (Code a b) -> Code c d
90 //
91 //class taskImp2 a :: Int a -> ((Code Long p) a->Code MTask Expr, a) | /*long Code delay &*/ isExpr p
92 //instance taskImp2 ()
93 //instance taskImp2 (Code t p)
94 //instance taskImp2 (Code a p, Code b q)
95 //instance taskImp2 (Code a p, Code b q, Code c r)
96 //instance taskImp2 (Code a p, Code b q, Code c r, Code d s)
97 //
98 //class taskImp a :: Int a -> (Int a->Code MTask Expr, a)
99 //instance taskImp ()
100 //instance taskImp (Code t p)
101 //instance taskImp (Code a p, Code b q)
102 //instance taskImp (Code a p, Code b q, Code c r)
103 //instance taskImp (Code a p, Code b q, Code c r, Code d s)
104 //
105 //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
106 //class types a :: a
107 //instance types ()
108 //instance types (Code a p) | typeSelector a & isExpr p
109 //instance types (Code a p, Code b q) | typeSelector a & isExpr p & typeSelector b & isExpr q
110 //instance types (Code a p, Code b q, Code c r) | typeSelector a & isExpr p & typeSelector b & isExpr q & typeSelector c & isExpr r
111 //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
112 //
113 //codeMTaskBody :: (Code v w) (Code c d) -> Code e f
114 //instance fun Code ()
115 //instance fun Code (Code t p) | type, showType t & isExpr p
116 //instance fun Code (Code a p, Code b q) | showType a & showType b
117 //instance fun Code (Code a p, Code b q, Code c r) | showType a & showType b & showType c
118 //instance output Code
119 //instance pinMode Code
120 //instance digitalIO Code
121 //instance dIO Code
122 //instance aIO Code
123 //instance analogIO Code
124 //instance noOp Code
125 //
126 //:: Code a p = C ((ReadWrite (Code a Expr)) CODE -> CODE)
127 //:: CODE =
128 // { fresh :: Int
129 // , freshMTask :: Int
130 // , funs :: [String]
131 // , ifuns :: Int
132 // , vars :: [String]
133 // , ivars :: Int
134 // , setup :: [String]
135 // , isetup :: Int
136 // , loop :: [String]
137 // , iloop :: Int
138 // , includes :: [String]
139 // , def :: Def
140 // , mode :: Mode
141 // , binds :: [String]
142 // }
143 //
144 //unC :: (Code a p) -> ((ReadWrite (Code a Expr)) CODE -> CODE)
145 //
146 //:: Def = Var | Fun | Setup | Loop
147 //:: Mode = /*MainMode |*/ NoReturn | Return String | SubExp | Assign String
148 //
149 //setMode :: Mode -> Code a p
150 //getMode :: (Mode -> Code a p) -> Code a p
151 //embed :: (Code a p) -> Code a p
152 //(+.+) infixl 5 :: (Code a p) (Code b q) -> Code c r
153 //fresh :: (Int -> (Code a p)) -> (Code a p)
154 //freshMTask :: (Int -> (Code a p)) -> (Code a p)
155 //setCode :: Def -> (Code a p)
156 //getCode :: (Def -> Code a p) -> (Code a p)
157 //brac :: (Code a p) -> Code b q
158 //funBody :: (Code a p) -> Code b q
159 //codeOp2 :: (Code a p) String (Code b q) -> Code c r
160 //include :: String -> Code a b
161 //argList :: [a] -> String | toCode a
162 //c :: a -> Code b p | toCode a
163 //indent :: Code a p
164 //unindent :: Code a p
165 //nl :: Code a p
166 //setBinds :: [String] -> Code a p
167 //addBinds :: String -> Code a p
168 //getBinds :: ([String] -> Code a p) -> (Code a p)
169 //
170 //// ----- driver ----- //
171 //
172 //compile :: (Main (Code a p)) -> [String]
173 //mkset :: [a] -> [a] | Eq a
174 //newCode :: CODE