BASIC 0.1.0.0 → 0.1.1.0
raw patch · 6 files changed
+32/−8 lines, 6 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Language.BASIC: (<) :: Expr a -> Expr a -> Expr a
+ Language.BASIC: (<=) :: Expr a -> Expr a -> Expr a
+ Language.BASIC: (==) :: Expr a -> Expr a -> Expr a
+ Language.BASIC: (>) :: Expr a -> Expr a -> Expr a
+ Language.BASIC: (>=) :: Expr a -> Expr a -> Expr a
+ Language.BASIC: (^) :: Expr a -> Expr a -> Expr a
- Language.BASIC: RND :: () -> Expr a
+ Language.BASIC: RND :: (Expr a) -> Expr a
Files
- BASIC.cabal +1/−1
- Language/BASIC/Interp.hs +6/−0
- Language/BASIC/Parser.hs +21/−5
- Language/BASIC/Translate.hs +2/−0
- Language/BASIC/Types.hs +1/−1
- examples/HiLo.hs +1/−1
BASIC.cabal view
@@ -1,5 +1,5 @@ Name: BASIC-Version: 0.1.0.0+Version: 0.1.1.0 License: BSD3 Author: Lennart Augustsson Maintainer: Lennart Augustsson
Language/BASIC/Interp.hs view
@@ -54,7 +54,13 @@ (Dbl d1, "-", Dbl d2) -> return $ Dbl (d1 - d2) (Dbl d1, "*", Dbl d2) -> return $ Dbl (d1 * d2) (Dbl d1, "/", Dbl d2) -> return $ Dbl (d1 / d2)+ (Dbl d1, "^", Dbl d2) -> return $ Dbl (d1 ** d2) (Dbl d1, "<>", Dbl d2) -> return $ Dbl (if d1 /= d2 then 1 else 0)+ (Dbl d1, "==", Dbl d2) -> return $ Dbl (if d1 == d2 then 1 else 0)+ (Dbl d1, "<", Dbl d2) -> return $ Dbl (if d1 < d2 then 1 else 0)+ (Dbl d1, ">", Dbl d2) -> return $ Dbl (if d1 < d2 then 1 else 0)+ (Dbl d1, "<=", Dbl d2) -> return $ Dbl (if d1 <= d2 then 1 else 0)+ (Dbl d1, ">=", Dbl d2) -> return $ Dbl (if d1 >= d2 then 1 else 0) x -> error $ "Expected numbers " ++ show x eval env (SGN e) = fmap (\ (Dbl x) -> Dbl $ signum x) $ eval env e eval env (INT e) = fmap (\ (Dbl x) -> Dbl $ fromIntegral $ truncate x) $ eval env e
Language/BASIC/Parser.hs view
@@ -3,8 +3,10 @@ module Language.BASIC.Parser( getBASIC, BASIC, PRINT(..), END(..), LET(..), GOTO(..), IF(..), THEN(..), INPUT(..), FOR(..), TO(..), NEXT(..),- Expr((:=)), (<>)+ Expr((:=)), (<>), (==), (<), (>), (<=), (>=), (^) ) where+import Prelude hiding ((==),(<),(>),(<=),(>=),(^))+import qualified Prelude as P import Data.List import Data.Maybe import Data.Function@@ -44,10 +46,24 @@ isCmd (Cmd _ _ _) = True isCmd _ = False -infix 4 <>+infix 4 <>, ==, <, >, <=, >= (<>) :: Expr a -> Expr a -> Expr a (<>) = binop "<>"+(==) :: Expr a -> Expr a -> Expr a+(==) = binop "=="+(<) :: Expr a -> Expr a -> Expr a+(<) = binop "<"+(>) :: Expr a -> Expr a -> Expr a+(>) = binop ">"+(<=) :: Expr a -> Expr a -> Expr a+(<=) = binop "<-"+(>=) :: Expr a -> Expr a -> Expr a+(>=) = binop ">=" +infixr 8 ^+(^) :: Expr a -> Expr a -> Expr a+(^) = binop "^"+ binop :: String -> Expr a -> Expr a -> Expr a binop op (Cmd l c [x]) y = Cmd l c (binops x op y) binop op x (Binop y ";" z) = Binop (Binop x op y) ";" z@@ -65,7 +81,7 @@ flex (Label l) = Label l flex (Binop e1 op e2) = Binop (flex e1) op (flex e2) flex (e1 := e2) = flex e1 := flex e2-flex (RND x) = RND x+flex (RND x) = RND (flex x) flex (INT x) = INT (flex x) flex (SGN x) = SGN (flex x) flex Var = Var@@ -137,7 +153,7 @@ instance Eq (END -> Expr a) instance Show (END -> Expr a) instance Num (END -> Expr a) where- fromInteger i c = Cmd i (if c == RETURN then Return else if c == REM then Rem else End) []+ fromInteger i c = Cmd i (if c P.== RETURN then Return else if c P.== REM then Rem else End) [] instance Eq (LET -> Expr a -> Expr b) instance Show (LET -> Expr a -> Expr b)@@ -147,7 +163,7 @@ instance Eq (GOTO -> t -> Expr a) instance Show (GOTO -> t -> Expr a) instance (Integral t) => Num (GOTO -> t -> Expr a) where- fromInteger i c l = Cmd i (if c == GOSUB then Gosub else Goto) [Label $ toInteger l]+ fromInteger i c l = Cmd i (if c P.== GOSUB then Gosub else Goto) [Label $ toInteger l] instance Eq (IF -> Expr a -> Expr b) instance Show (IF -> Expr a -> Expr b)
Language/BASIC/Translate.hs view
@@ -49,6 +49,7 @@ trans acmds = do atof <- newNamedFunction ExternalLinkage "atof" :: TFunction (Ptr Word8 -> IO Double) gets <- newNamedFunction ExternalLinkage "gets" :: TFunction (Ptr Word8 -> IO (Ptr Word8))+ power <- newNamedFunction ExternalLinkage "power" :: TFunction (Double -> Double -> IO Double) printfv <- newNamedFunction ExternalLinkage "printf" :: TFunction (Ptr Word8 -> VarArgs Word32) rand <- newNamedFunction ExternalLinkage "rand" :: TFunction (IO Word32) sranddev <- newNamedFunction ExternalLinkage "sranddev" :: TFunction (IO ())@@ -126,6 +127,7 @@ genExpr (Binop e1 "-" e2) = binop sub e1 e2 genExpr (Binop e1 "*" e2) = binop mul e1 e2 genExpr (Binop e1 "/" e2) = binop fdiv e1 e2+ genExpr (Binop e1 "^" e2) = binop (call power) e1 e2 genExpr (INT e) = do v <- genExpr e -- r <- frem v (1 :: Double)
Language/BASIC/Types.hs view
@@ -10,7 +10,7 @@ | Label Integer | Binop (Expr a) String (Expr a) | Expr a := Expr a- | RND () | INT (Expr a) | SGN (Expr a)+ | RND (Expr a) | INT (Expr a) | SGN (Expr a) | Var | I | S | X | Y | Z | None
examples/HiLo.hs view
@@ -9,7 +9,7 @@ 20 PRINT "* Welcome to HiLo *" 30 GOSUB 1000 - 100 LET I := INT(100 * RND())+ 100 LET I := INT(100 * RND(X)) -- 110 PRINT I 200 PRINT "Guess my number:" 210 INPUT X