Skip to content

Commit 7102dad

Browse files
committed
Version 1.0.0
changed args handling + add flags: > d = use dergee in trigo functions > i = force interactive mode update README.md
1 parent 9b9652f commit 7102dad

File tree

4 files changed

+51
-33
lines changed

4 files changed

+51
-33
lines changed

Evaluate.hs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,19 @@ evalPower (Val a : Val b : xs) = Result ((Val ((**) b a)) : xs)
6060
evalPower _ = MathError
6161

6262
evalFunc :: Function -> [Token] -> AngleFlag -> Result [Token]
63-
evalFunc Abs (Val a : xs) _ = Result (Val (abs a) : xs)
64-
evalFunc Tan (Val a : xs) aflag = Result (Val (convDeg aflag (tan a)) : xs)
65-
evalFunc ATan (Val a : xs) aflag = Result (Val (convDeg aflag (atan a)) : xs)
66-
evalFunc Sin (Val a : xs) aflag = Result (Val (convDeg aflag (sin a)) : xs)
67-
evalFunc ASin (Val a : xs) aflag = Result (Val (convDeg aflag (asin a)) : xs)
68-
evalFunc Cos (Val a : xs) aflag = Result (Val (convDeg aflag (cos a)) : xs)
69-
evalFunc ACos (Val a : xs) aflag = Result (Val (convDeg aflag (acos a)) : xs)
70-
evalFunc Log (Val a : xs) _ = Result (Val (log a) : xs)
71-
evalFunc Sqrt (Val a : xs) _ = Result (Val (sqrt a) : xs)
72-
evalFunc Floor (Val a : xs) _ = Result (Val (fromInteger (floor a)) : xs)
73-
evalFunc Ceiling (Val a : xs) _ = Result (Val (fromInteger (ceiling a)) : xs)
63+
evalFunc Abs (Val a : xs) _ = Result (Val (abs a) : xs)
64+
evalFunc Tan (Val a : xs) aflag = Result (Val (tan (convDeg aflag a)) : xs)
65+
evalFunc ATan (Val a : xs) aflag = Result (Val (atan (convDeg aflag a)) : xs)
66+
evalFunc Sin (Val a : xs) aflag = Result (Val (sin (convDeg aflag a)) : xs)
67+
evalFunc ASin (Val a : xs) aflag = Result (Val (asin (convDeg aflag a)) : xs)
68+
evalFunc Cos (Val a : xs) aflag = Result (Val (cos (convDeg aflag a)) : xs)
69+
evalFunc ACos (Val a : xs) aflag = Result (Val (acos (convDeg aflag a)) : xs)
70+
evalFunc Log (Val a : xs) _ = Result (Val (log a) : xs)
71+
evalFunc Sqrt (Val a : xs) _ = Result (Val (sqrt a) : xs)
72+
evalFunc Floor (Val a : xs) _ = Result (Val (fromInteger (floor a)) : xs)
73+
evalFunc Ceiling (Val a : xs) _ = Result (Val (fromInteger (ceiling a)) : xs)
7474
evalFunc _ _ _ = MathError
7575

7676
convDeg :: AngleFlag -> Double -> Double
77-
convDeg Deg val = val / (180 * pi)
77+
convDeg Deg val = val * (pi / 180)
7878
convDeg None val = val

Main.hs

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import System.Environment
99
import System.Console.ANSI
1010

1111
data OutputFlag = Verbose | Normal
12+
data InteractiveFlag = Interactive | Single
13+
14+
type Flags = (InteractiveFlag, OutputFlag, AngleFlag)
1215

1316
prompt :: IO String
1417
prompt = do
@@ -24,11 +27,11 @@ interactive oflag aflag = do
2427
":q" -> exit
2528
"clear" -> clearOut >> interactive oflag aflag
2629
_ -> case oflag of
27-
Normal -> evaluateInput input aflag (interactive Normal aflag)
28-
Verbose -> verbose input aflag (interactive Verbose aflag)
30+
Normal -> evalNormal input aflag (interactive oflag aflag)
31+
Verbose -> evalVerbose input aflag (interactive oflag aflag)
2932

30-
evaluateInput :: String -> AngleFlag -> IO () -> IO ()
31-
evaluateInput input aflag fn = case parse input of
33+
evalNormal :: String -> AngleFlag -> IO () -> IO ()
34+
evalNormal input aflag fn = case parse input of
3235
-- successful parse
3336
Result rp -> case eval rp aflag of
3437
-- successful evaluated
@@ -48,8 +51,8 @@ evaluateInput input aflag fn = case parse input of
4851
putStrLn "Mathematical Error!"
4952
fn
5053

51-
verbose :: String -> AngleFlag -> IO () -> IO ()
52-
verbose input aflag fn = case lexer input of
54+
evalVerbose :: String -> AngleFlag -> IO () -> IO ()
55+
evalVerbose input aflag fn = case lexer input of
5356
-- successful lexer
5457
Result rl -> case postfix rl of
5558
Result rp -> do
@@ -91,25 +94,36 @@ printRed s = do
9194
setSGR [Reset]
9295

9396

94-
parseArgs :: [String] -> IO ()
95-
parseArgs [] = interactive Normal None
96-
parseArgs ["-h"] = usage >> exit
97-
parseArgs ["-V"] = version >> exit
98-
parseArgs ["-v"] = interactive Verbose None
99-
parseArgs (input : "-v" : []) = verbose input None exit
100-
parseArgs ("-v" : input : []) = verbose input None exit
101-
parseArgs [input] = evaluateInput input None exit
102-
parseArgs _ = exit
97+
parseArgs :: [String] -> Flags -> IO ()
98+
parseArgs [] fs = execute fs Nothing
99+
parseArgs ("-d" : xs ) (i, o, _) = parseArgs xs (i, o, Deg)
100+
parseArgs ("-h" : _) _ = usage >> exit
101+
parseArgs ("-i" : xs) (_, o, a) = parseArgs xs (Interactive, o, a)
102+
parseArgs ("-v" : xs) (i, _, a) = parseArgs xs (i, Verbose, a)
103+
parseArgs ("-V" : _) _ = version >> exit
104+
parseArgs [input] fs = execute fs (Just input)
105+
parseArgs _ _ = usage >> exit
106+
107+
108+
execute :: Flags -> Maybe String -> IO ()
109+
execute (Interactive, Verbose, a) (Just input) = evalVerbose input a (interactive Verbose a)
110+
execute (Interactive, Normal, a) (Just input) = evalNormal input a (interactive Normal a)
111+
execute (Single, Verbose, a) (Just input) = evalVerbose input a exit
112+
execute (Single, Normal, a) (Just input) = evalNormal input a exit
113+
execute (_, v, a) Nothing = interactive v a
103114

104115
version :: IO ()
105116

106117
usage :: IO ()
107118
usage = do
108119
putStrLn "Usage:"
109-
putStrLn "\tcalc [TERM] [ARGUMENT] - Calculator\n"
110-
putStrLn "\t-h\thelp\t- show this dialog"
111-
putStrLn "\t-v\tverbose\t- print token and postfix"
112-
putStrLn "\t-V\tversion\t- show version"
120+
putStrLn "\tcalc [ARGUMENT] [TERM] - Calculator"
121+
putStrLn "\t[TERM] musst be at the end.\n"
122+
putStrLn "\t-d\tdegrese\t\t- use degree in trigonometric functions"
123+
putStrLn "\t-h\thelp\t\t- show this dialog"
124+
putStrLn "\t-i\tinteractive\t- force interactive mode"
125+
putStrLn "\t-v\tverbose\t\t- print token and postfix"
126+
putStrLn "\t-V\tversion\t\t- show version"
113127

114128
clearOut :: IO ()
115129
clearOut = do
@@ -121,4 +135,6 @@ exit = do
121135
exitWith ExitSuccess
122136

123137
main :: IO ()
124-
main = getArgs >>= parseArgs
138+
main = do
139+
args <- getArgs
140+
parseArgs args (Single, Normal, None)

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ PREFIX := /usr/local/
99
INSTALL_DIR := bin/
1010
MAN_DIR := man/man1/
1111

12-
VERSION := v0.2.0
12+
VERSION := v1.0.0
1313

1414
build: clean version
1515
ghc $(CFLAGS) -o $(TARGET) $(MAIN) $(MODULES)

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
simple interactive command line calculator.
33

44
## Arguments - calc [TERM] [ARGUMENT]
5+
* `-d` use degree in trigonometric functions
56
* `-h` print help dialoge
7+
* `-i` force interactive mode
68
* `-v` verbose mode: outputs token and postfix notation
79
* `-V` version
810

0 commit comments

Comments
 (0)