implementation module mTaskInterpret //import iTasks import gdynamic, gCons, GenEq, StdMisc, StdArray, GenBimap import GenPrint import StdEnum import mTask import StdFile import StdString from StdFunc import o, const import StdBool import StdTuple import Data.Tuple import Data.Monoid import Data.Functor import StdList from Data.Func import $ from Text import class Text(concat,join,toUpperCase), instance Text String toByteVal :: BC -> [Char] toByteVal b # bt = toBC b = [bt:case b of (BCPush i) = i (BCAnalogRead i) = [toChar i] (BCAnalogWrite i) = [toChar i] (BCDigitalRead i) = [toChar i] (BCDigitalWrite i) = [toChar i] (BCJmp i) = [toChar i] (BCJmpT i) = [toChar i] (BCJmpF i) = [toChar i] _ = []] where toBC b = toChar $ consIndex{|*|} b + 1 instance Semigroup (ByteCode a p) where mappend m n = BC \s->let (b1, (b2, t)) = runBC m <$> runBC m s in (b1 ++ b2, t) instance Monoid (ByteCode a p) where mempty = retrn [] (<++>) infixl 2 :: (ByteCode a p) (ByteCode b q) -> ByteCode c r (<++>) m n = BC \s->let (b1, (b2, t)) = runBC n <$> runBC m s in (b1 ++ b2, t) (<+->) infixr 1 (<+->) m n :== m <++> retrn n runBC (BC m) = m retrn :: ([BC] -> ByteCode a p) retrn = BC o tuple instance toByteCode Bool where toByteCode True = [toChar 1] toByteCode False = [toChar 0] instance toByteCode Int where toByteCode n = map toChar [n/(2<<7),n rem 265] instance toByteCode Long where toByteCode (L n) = toByteCode n instance toByteCode Char where toByteCode c = [c] instance toByteCode String where toByteCode s = undef instance toByteCode Button where toByteCode s = [toChar $ consIndex{|*|} s] instance toChar Pin where toChar (Digital p) = toChar $ consIndex{|*|} p + 1 toChar (Analog p) = toChar $ consIndex{|*|} p + 1 derive gPrint BC, AnalogPin, Pin, DigitalPin derive consIndex BC, Pin, Button derive consName BC, Pin, Button instance arith ByteCode where lit x = retrn [BCPush $ toByteCode x] (+.) x y = x <++> y <+-> [BCAdd] (-.) x y = x <++> y <+-> [BCSub] (*.) x y = x <++> y <+-> [BCMul] (/.) x y = x <++> y <+-> [BCDiv] instance boolExpr ByteCode where (&.) x y = x <++> y <+-> [BCAnd] (|.) x y = x <++> y <+-> [BCOr] Not x = x <+-> [BCNot] (==.) x y = x <++> y <+-> [BCEq] (!=.) x y = x <++> y <+-> [BCNeq] (<.) x y = x <++> y <+-> [ BCLes] (>.) x y = x <++> y <+-> [BCGre] (<=.) x y = x <++> y <+-> [BCLeq] (>=.) x y = x <++> y <+-> [BCGeq] instance analogIO ByteCode where analogRead p = retrn [BCAnalogRead $ pin p] analogWrite p b = b <+-> [BCAnalogWrite $ pin p] instance digitalIO ByteCode where digitalRead p = retrn [BCDigitalRead $ pin p] digitalWrite p b = b <+-> [BCDigitalWrite $ pin p] instance If ByteCode Stmt Stmt Stmt where If b t e = BCIfStmt b t e instance If ByteCode Stmt e Stmt where If b t e = BCIfStmt b t e instance If ByteCode Stmt Stmt e where If b t e = BCIfStmt b t e instance If ByteCode x y Expr where If b t e = BCIfStmt b t e instance IF ByteCode where IF b t e = BCIfStmt b t e (?) b t = BCIfStmt b t $ retrn [] BCIfStmt b t e = withLabel \else->withLabel \endif->retrn [BCJmpF else] <++> t <++> retrn [BCJmp endif] <++> e <++> retrn [BCLab endif] instance noOp ByteCode where noOp = mempty withLabel :: (Int -> (ByteCode b q)) -> ByteCode b q withLabel f = BC \s->let [fresh:fs] = s.freshl in runBC (f fresh) {s & freshl=fs} /* instance sds ByteCode where sds f = undef/*{main = let var = 42 (v In body) = f var in unMain body }*/ con f = undef */ instance serial ByteCode where serialAvailable = retrn [BCSerialAvail] serialPrint s = retrn [BCSerialPrint] serialPrintln s = retrn [BCSerialPrintln] serialRead = retrn [BCSerialRead] serialParseInt = retrn [BCSerialParseInt] instance zero BCState where zero = {freshl=[1..]} toRealByteCode :: (ByteCode a Expr) -> String toRealByteCode x # (bc, st) = runBC x zero = concat $ map (toString o toByteVal) bc toReadableByteCode :: (ByteCode a Expr) -> String toReadableByteCode x # (bc, st) = runBC x zero = join "\n" $ map printToString bc toReadableByteVal :: BC -> String toReadableByteVal a = printToString a Start :: String Start = toReadableByteCode bc where bc :: ByteCode Int Expr bc = (lit 36 +. lit 42) +. lit 44 //to16bit :: Int -> String //to16bit i = toString (toChar (i/265)) +++ toString (toChar (i rem 265)) // ////Run test programma en pretty print ////Start :: String ////Start = "t" +++ to16bit (size b) +++ b //Start :: Main (ByteCode Int Expr) //Start = bc // where // bc = sds \x=43 In {main = If (x ==. lit 42) (analogRead A1) (analogRead A0)} // b = toRealByteCode bc //Start :: ByteCode Int Expr //Start = If (lit True) (analogRead A1) (analogRead A0) //Start = If ((lit 36) ==. (lit 42)) (noOp) (noOp)