/
Main.lhs
63 lines (46 loc) · 1.6 KB
/
Main.lhs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
\begin{code}
{-# LANGUAGE RankNTypes #-}
module Main (main) where
import Control.Monad.Trans.Class (MonadTrans, lift)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.CC (CCT, runCCT)
import System.Environment (getArgs)
import System.Console.Haskeline (InputT, defaultSettings, getInputLine)
import System.Console.Haskeline.IO
(InputState, initializeInput, closeInput, queryInput, cancelInput)
import Control.Exception (bracketOnError)
import Parser
import Evaluate
import Primitives
main :: IO ()
main = do
args <- getArgs
case length args >= 1 of
True -> loadIO (head args)
False -> replIO
loadIO :: FilePath -> IO ()
loadIO path = runProgram defaultBindings (load path)
replIO :: IO ()
replIO = bracketOnError
(initializeInput defaultSettings)
cancelInput
(\hd -> replInput hd >> closeInput hd)
where
replInput hd = runProgram defaultBindings (repl hd)
load :: FilePath -> ProgramEnv ()
load path = readFile' path >>= parse' >>= evaluate >> return ()
repl :: InputState -> ProgramEnv ()
repl hd = do
minput <- queryInput' hd (getInputLine "> ")
case minput of
Just line -> parse' line >>= evaluate >>= print' >> repl hd
Nothing -> return ()
parse' :: MonadIO m => String -> m Expr
print' :: (MonadIO m, Show a) => a -> m ()
readFile' :: MonadIO m => FilePath -> m String
queryInput' :: MonadIO m => InputState -> InputT IO a -> m a
parse' = liftIO . parseStr
print' = liftIO . print
readFile' = liftIO . readFile
queryInput' hd input = liftIO (queryInput hd input)
\end{code}