X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;ds=sidebyside;f=mTaskInterpret.icl;h=164db5e60ab64688df2e2ddf1136ae959d3a7511;hb=6d956995e169ae8fd44d62e26e35d499a9660225;hp=697ce50da46fc200d6d9b8b0d73d13b47189e69d;hpb=848595d1288804d6de43625f9e6f1cf76295c285;p=mTask.git diff --git a/mTaskInterpret.icl b/mTaskInterpret.icl index 697ce50..164db5e 100644 --- a/mTaskInterpret.icl +++ b/mTaskInterpret.icl @@ -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,15 +265,23 @@ 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 @@ -301,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 @@ -362,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) )