diff --git a/a4/src/APL/InterpIO.hs b/a4/src/APL/InterpIO.hs index 89c8d06..ba20de8 100644 --- a/a4/src/APL/InterpIO.hs +++ b/a4/src/APL/InterpIO.hs @@ -94,3 +94,8 @@ runEvalIO evalm = do runEvalIO' r db m Left e -> pure $ Left e runEvalIO' _ _ (Free (ErrorOp e)) = pure $ Left e + runEvalIO' r db (Free (TryCatchOp m1 m2)) = do + result <- runEvalIO' r db m1 + case result of + Right x -> pure $ Right x + Left _ -> runEvalIO' r db m2 diff --git a/a4/src/APL/Interp_Tests.hs b/a4/src/APL/Interp_Tests.hs index 0edcded..2d4d769 100644 --- a/a4/src/APL/Interp_Tests.hs +++ b/a4/src/APL/Interp_Tests.hs @@ -142,7 +142,23 @@ ioTests = getState r @?= Right [(ValInt 0, ValInt 5)], - -- + --- + testCase "TryCatch try1" $ do + r <- evalIO' (TryCatch (CstInt 1) (CstInt 2)) + r @?= Right (ValInt 1), + --- + testCase "TryCatch try2" $ do + r <- evalIO' (TryCatch (CstInt 1) (Div (CstInt 1) (CstInt 0))) + r @?= Right (ValInt 1), + --- + testCase "TryCatch catch1" $ do + r <- evalIO' (TryCatch (Div (CstInt 1) (CstInt 0)) (CstInt 1)) + r @?= Right (ValInt 1), + --- + testCase "TryCatch catch2" $ do + r <- evalIO' (TryCatch (Div (CstInt 1) (CstInt 0)) (Div (CstInt 1) (CstInt 0))) + r @?= Left "Division by zero", + --- testCase "KvPutOp" $ do r <- evalIO' (KvPut (CstInt 1) (CstInt 2)) r @?= Right (ValInt 2),