{-# LANGUAGE LambdaCase, TupleSections #-} module Main where import System.Environment import System.Exit import Compiler import CompilerMacros import Optimiser import Parser import VM usage :: IO () usage = do progname <- getProgName putStrLn $ "Usage: " ++ progname ++ " [filename.lisp]" main :: IO () main = do (mfname, source) <- getArgs >>= \case [] -> (Nothing,) <$> getContents [arg] -> (Just arg,) <$> readFile arg _ -> usage >> exitFailure prog <- parseProgram mfname source >>= either (die . show) return let prog' = compilerMacros prog irprog <- either die return (compileProgram prog') let opt = optimise irprog -- print opt vmRun opt