octopus-0.0.2.0: main.hs
import Import
import System.IO
import System.Environment
import System.Console.GetOpt
import System.Exit
import Control.Concurrent.MVar
import qualified Data.Map as Map
import Language.Octopus
import Language.Octopus.Parser
import Language.Octopus.Libraries
import Language.Octopus.Primitive (resolveSymbol)
import Language.Octopus.Data.Shortcut (mkOb)
progVersion = "v0.0.1a"
main :: IO ()
main = do
(opts, filepath) <- getOptions
cache <- newMVar Map.empty
parse_e <- parseOctopusFile filepath <$> readFile filepath
case parse_e of
Left err -> print err
Right (_, val) -> do
fileEnv <- eval cache initialEnv val
case resolveSymbol (intern "main") fileEnv of
Nothing -> return ()
Just main -> print =<< eval cache fileEnv main
exitSuccess
data Options = Options {
} deriving (Show)
startOptions = Options {
}
getOptions :: IO (Options, FilePath)
getOptions = do
(actions, args, errors) <- getOpt Permute options <$> getArgs
if errors == []
then case args of
[] -> putErrLn "No file supplied." >> exitFailure
[file] -> do
opts <- foldl (>>=) (return startOptions) actions
return (opts, file)
_ -> putErrLn "Too many files supplied." >> exitFailure
else mapM putErrLn errors >> exitFailure
options :: [OptDescr (Options -> IO Options)]
options =
[ Option "V" ["version"]
(NoArg
(\_ -> do
hPutStrLn stderr progVersion
exitSuccess))
"Print version"
, Option "h" ["help"]
(NoArg
(\_ -> do
prg <- getProgName
putErrLn "Octopus interpreter."
putErrLn "This program is lisenced under the GPLv3."
putErrLn (usageInfo (prg ++ " [options] file") options)
putErrLn "Interpret the given file of Octopus code."
exitSuccess))
"Show help"
]
putErrLn = hPutStrLn stderr