🤡
This commit is contained in:
35
a5/apl.hs
Normal file
35
a5/apl.hs
Normal file
@ -0,0 +1,35 @@
|
||||
module Main (main) where
|
||||
|
||||
import APL.Eval (Val (..), eval, runEval)
|
||||
import APL.Parser (parseAPL)
|
||||
import System.Environment
|
||||
( getArgs,
|
||||
getProgName,
|
||||
)
|
||||
import System.Exit (ExitCode (..), exitWith)
|
||||
import System.IO (hPutStrLn, stderr, stdout)
|
||||
|
||||
stringVal :: Val -> String
|
||||
stringVal (ValBool b) = show b
|
||||
stringVal (ValInt x) = show x
|
||||
stringVal ValFun {} = "#<fun>"
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
args <- getArgs
|
||||
case args of
|
||||
[fname] -> do
|
||||
s <- readFile fname
|
||||
case parseAPL fname s of
|
||||
Left err -> hPutStrLn stderr err
|
||||
Right e -> case runEval (eval e) of
|
||||
Left err -> hPutStrLn stderr $ show err
|
||||
Right v -> hPutStrLn stdout $ stringVal v
|
||||
_ -> do
|
||||
prog <- getProgName
|
||||
failure $ "Usage: " ++ prog ++ " FILE"
|
||||
pure ()
|
||||
where
|
||||
failure e = do
|
||||
hPutStrLn stderr $ show e
|
||||
exitWith $ ExitFailure 1
|
Reference in New Issue
Block a user