refactoors
[mTask.git] / mTaskInterpret.icl
index f1eeedc..164db5e 100644 (file)
@@ -160,11 +160,14 @@ instance fromByteCode MTaskInterval
                = OnInterrupt $ fromByteCode s bitand 127
 instance fromByteCode MTaskDeviceSpec where
        fromByteCode s = let c = toInt s.[0] in
-               {MTaskDeviceSpec
-               |haveLed=(c bitand 1) > 0
-               ,haveAio=(c bitand 2) > 0
-               ,haveDio=(c bitand 4) > 0
-               ,bytesMemory=from16bit $ s % (1,3)
+               { MTaskDeviceSpec
+               | haveLed     = (c bitand 1) > 0
+               , haveAio     = (c bitand 2) > 0
+               , haveDio     = (c bitand 4) > 0
+               , bytesMemory = from16bit $ s % (1,3)
+               , stackSize  = from16bit $ s % (3,5)
+               , aPins       = toInt s.[5]
+               , dPins       = toInt s.[6]
                }
 
 derive gPrint Long, UserLED, Button, AnalogPin, DigitalPin, PinMode, Pin, BC, MTaskDeviceSpec
@@ -252,8 +255,8 @@ BCIfStmt (BC b) (BC t) (BC e) = BC $
        t >>| tell [BCJmp endif, BCLab else] >>|
        e >>| tell [BCLab endif]
 
-freshl = get >>= \st=:{freshl=[fr:frs]}->put {st & freshl=frs} >>| pure fr
-freshs = get >>= \st=:{freshs=[fr:frs]}->put {st & freshs=frs} >>| pure fr
+freshl = get >>= \st=:{freshl}->put ({st & freshl=freshl+1}) >>| pure freshl
+freshs = get >>= \st=:{freshs}->put ({st & freshs=freshs+1}) >>| pure freshs
 
 instance noOp ByteCode where noOp = tell` [BCNop]
 
@@ -262,14 +265,24 @@ unBC (BC x) = x
 
 instance sds ByteCode where
        sds f = {main = BC $ freshs
-                               >>= \sdsi->pure {BCShare | sdsi=sdsi,sdsval=BCValue 0}
-                               >>= \sds->pure (f (tell` [BCSdsFetch sds]))
-                               >>= \(v In bdy)->modify (addSDS sds v)
-                               >>| unBC (unMain bdy)}
-               where
-                       addSDS sds v s = {s & sdss=[{sds & sdsval=BCValue v}:s.sdss]}
-
+               >>= \sdsi->pure {BCShare | sdsname="", sdsi=sdsi, sdsval=BCValue 0}
+               >>= \sds ->pure (f $ tell` [BCSdsFetch sds])
+               >>= \(v In bdy)->modify (addSDS sds v)
+               >>| unBC (unMain bdy)}
+       where
+               addSDS sds v s = {s & sdss=[{sds & sdsval=BCValue v}:s.sdss]}
        con f = undef
+
+instance namedsds ByteCode where
+       namedsds f = {main = BC $ freshs
+               >>= \sdsi->pure {BCShare | sdsname="", sdsi=sdsi, sdsval=BCValue 0}
+               >>= \sds ->pure (f $ tell` [BCSdsFetch sds])
+               >>= \(v Named n In bdy)->modify (addSDS sds n v)
+               >>| unBC (unMain bdy)}
+       where
+               addSDS sds n v s = {s & sdss=[{sds & sdsname=n, sdsval=BCValue v}:s.sdss]}
+
+instance sdspub ByteCode where
        pub (BC x) = BC $ censor (\[BCSdsFetch s]->[BCSdsPublish s]) x
 
 instance assign ByteCode where
@@ -299,7 +312,7 @@ instance retrn ByteCode where
   retrn = tell` [BCReturn]
 
 instance zero BCState where
-       zero = {freshl=[1..], freshs=[1..], sdss=[]}
+       zero = {freshl=1, freshs=1, sdss=[]}
 
 toRealByteCode :: (ByteCode a b) BCState -> (String, BCState)
 toRealByteCode x s
@@ -360,15 +373,15 @@ toMessages interval x s
 instance == BCShare where (==) a b = a.sdsi == b.sdsi
 
 //Start = toMessages (OnInterval 500) $ toRealByteCode (unMain bc) zero
-Start = fst $ toReadableByteCode (unMain $ bc) zero
-//Start = fst $ toReadableByteCode (unMain $ blink LED1) zero
-//Start = let (bcs, st) = toReadableByteCode (unMain bc) zero
-//             in (bcs, st.sdss)
+//Start = [fst $ toReadableByteCode (unMain $ p0) zero
+//             ,'Text'.concat $ compile p0
+//             ]
+Start = toReadableByteCode (unMain $ p0) zero
        where
-//             bc = {main = ledOn (lit LED1)}
-//             bc = sds \x=5 In 
-//                     sds \y=4 In
-//                     {main = If (y ==. lit 0) (pub x) (x =. x *. y :. y =. y -. lit 1)}
+               p0 :: (Main (a Int Expr)) | assign, namedsds, sds, arith a
+//             p0 = sds \x = 6 In {main = x =. x *. lit 7}
+               p0 = namedsds \x = 6 Named "x" In {main = x =. x *. lit 7}
+
                bc  = {main =
                        IF (analogRead A0 >. lit 50)
                          ( digitalWrite D0 (lit True)  )