From a2e9732fb8f432e89d820601b1035c36c69e9340 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Sat, 24 Sep 2022 20:48:21 +0300 Subject: Add builtins --- src/Builtins.hs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/Builtins.hs') diff --git a/src/Builtins.hs b/src/Builtins.hs index ce47ac9..e7f0cda 100644 --- a/src/Builtins.hs +++ b/src/Builtins.hs @@ -8,6 +8,8 @@ builtinEnv :: Env builtinEnv = M.fromList [ ("+", builtinAdd2), ("-", builtinSubtract2), + ("*", builtinMultiply2), + ("/", builtinDivide2), ("head", builtinHead), ("tail", builtinTail), ("prepend", builtinPrepend) @@ -33,6 +35,27 @@ builtinSubtract2 = return $ ASTFunction $ inner in ASTFunction outer +builtinMultiply2 :: AST +builtinMultiply2 = + let outer _ ast1 = do + (ASTInteger a) <- assertIsASTInteger ast1 + let inner _ ast2 = do + (ASTInteger b) <- assertIsASTInteger ast2 + return $ ASTInteger $ a * b + return $ ASTFunction $ inner + in ASTFunction outer + +builtinDivide2 :: AST +builtinDivide2 = + let outer _ ast1 = do + (ASTInteger a) <- assertIsASTInteger ast1 + let inner _ ast2 = do + (ASTInteger b) <- assertIsASTInteger ast2 + when (b == 0) $ throwError $ LException $ "division by zero" + return $ ASTInteger $ a `div` b + return $ ASTFunction $ inner + in ASTFunction outer + builtinHead :: AST builtinHead = let outer _ ast = do -- cgit v1.3