{-# LANGUAGE TypeOperators #-} module Demo where import Control.Applicative ((<$>)) import Data.Word import Language.Embedded.Imperative import Language.Embedded.Backend.C import Language.Embedded.CExp -- | Custom instruction type with: references, control structures and file I/O type CMD = RefCMD :+: ControlCMD :+: FileCMD -- | Program that asks the user for numbers and prints their sum sumInput :: Program CMD (Param2 CExp CType) () sumInput = do done <- initRef false sum <- initRef (0 :: CExp Word32) while (not_ <$> getRef done) $ do printf "Enter a number (0 means done): " n <- fget stdin iff (n #== 0) (setRef done true) (modifyRef sum (+n)) printf "The sum of your numbers is %d.\n" =<< getRef sum run_sumInput = runCompiled sumInput testAll = do tag "sumInput" >> compareCompiled sumInput (runIO sumInput) (unlines $ map show $ reverse [0..20]) where tag str = putStrLn $ "---------------- examples/Demo.hs/" ++ str ++ "\n"