Support for nested variable definitions
This commit is contained in:
parent
3dc3e3b842
commit
d3f63b1d15
2 changed files with 40 additions and 20 deletions
27
app/Main.hs
27
app/Main.hs
|
@ -2,7 +2,7 @@ module Main (main) where
|
|||
|
||||
import Text.Parsec
|
||||
|
||||
import Lib (exprparser, evaluate, replaceVars, Expr, extractVariableDefinitions)
|
||||
import Lib (exprparser, evaluate, replaceVars, Expr, extractVariableDefinitions, updateVariables)
|
||||
|
||||
import Data.Map (Map)
|
||||
import qualified Data.Map as Map
|
||||
|
@ -21,20 +21,27 @@ precision = 5 :: Int
|
|||
showRatio :: Int -> Rational -> String
|
||||
showRatio p r = (if (r < 0) then "-" else "") ++ prepoint_digits ++ (if (length postpoint_digits > 0) then ("." ++ postpoint_digits) else "")
|
||||
where
|
||||
prepoint_digits = init . show . round . abs $ (r * 10)
|
||||
postpoint_digits = reverse . dropWhile (=='0') . reverse .(take p) . (drop (length prepoint_digits)) . show . round . abs $ (r * 10^p)
|
||||
prepoint_digits = init . show . round . abs $ (r * 10)
|
||||
postpoint_digits = reverse . dropWhile (=='0') . reverse .(take p) . (drop (length prepoint_digits)) . show . round . abs $ (r * 10^p)
|
||||
|
||||
useResult :: Map String Rational -> Either ParseError Expr -> String
|
||||
useResult vs (Right expr) = either id ((showRatio precision) . evaluate) $ replaceVars expr vs
|
||||
useResult vs (Left error) = show error
|
||||
useResult :: Map String Rational -> Expr -> String
|
||||
useResult vs expr = either id ((showRatio precision) . evaluate) $ replaceVars expr vs
|
||||
|
||||
ioLoop :: Map String Rational -> IO ()
|
||||
ioLoop vs = do done <- isEOF
|
||||
if done
|
||||
then putStrLn "Quit!"
|
||||
else do inp <- getLine
|
||||
let expr = parse exprparser "<stdin>" inp
|
||||
let uvs = either (const vs) (\e -> Map.unionWith (flip const) vs (extractVariableDefinitions e)) expr
|
||||
putStrLn $ useResult uvs expr
|
||||
ioLoop uvs
|
||||
let expr_res = parse exprparser "<stdin>" inp
|
||||
case expr_res of
|
||||
Left err -> do
|
||||
putStrLn . show $ err
|
||||
ioLoop vs
|
||||
Right expr -> do
|
||||
let vardefs = extractVariableDefinitions expr
|
||||
let uvs_res = updateVariables vardefs vs
|
||||
case uvs_res of
|
||||
Left err -> putStrLn err
|
||||
Right uvs -> putStrLn $ useResult uvs expr
|
||||
ioLoop (either (const vs) (id) uvs_res)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue