From f74d9c9bb3722fd20cea000b4f0c2a74be289a9c Mon Sep 17 00:00:00 2001 From: Akshay Date: Sat, 10 Oct 2020 11:15:42 +0530 Subject: add quasiquote, unquote modifiers, basic boolean operations add more info to readme --- src/Operators.hs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'src/Operators.hs') diff --git a/src/Operators.hs b/src/Operators.hs index beb6364..e607250 100644 --- a/src/Operators.hs +++ b/src/Operators.hs @@ -19,6 +19,7 @@ primitives = , ("<=", comparator (<=)) , ("=", comparator (==)) , ("!=", comparator (/=)) + , ("not", unaryBool not) ] data LispNumber = I Integer @@ -38,7 +39,9 @@ instance Num LispNumber where (F a) * (F b) = F $ a * b instance Fractional LispNumber where - (I a) / (I b) = I $ a `div` b + (I a) / (I b) = F $ fromIntegral a / fromIntegral b + (F a) / (I b) = F $ a / fromIntegral b + (I a) / (F b) = F $ fromIntegral a / b (F a) / (F b) = F $ a / b arithmetic :: (LispNumber -> LispNumber -> LispNumber) -> [Expr] -> LispResult Expr @@ -55,6 +58,16 @@ comparator op args as <- mapM unwrapNum args return . BoolLiteral . all (== True) $ zipWith op as (tail as) +unaryBool :: (Bool -> Bool) -> [Expr] -> LispResult Expr +unaryBool op args + | length args /= 1 = throwError $ ArgCount 1 args + | otherwise = BoolLiteral . op <$> unwrapBool (head args) + +naryBool :: (Bool -> Bool -> Bool) -> [Expr] -> LispResult Expr +naryBool op args + | length args < 2 = throwError $ ArgCount 2 args + + unwrapNum :: Expr -> LispResult LispNumber unwrapNum (IntLiteral n) = return $ I n unwrapNum (FloatLiteral n) = return $ F n @@ -63,3 +76,7 @@ unwrapNum x = throwError $ TypeMismatch "number" x wrapNum :: LispNumber -> Expr wrapNum (I n) = IntLiteral n wrapNum (F n) = FloatLiteral n + +unwrapBool :: Expr -> LispResult Bool +unwrapBool (BoolLiteral s) = return s +unwrapBool x = throwError $ TypeMismatch "boolean" x -- cgit v1.2.3