1 import System
.IO (hFlush, stdout)
2 import Control
.Monad
.Except
(runExceptT
)
3 import Control
.Monad
.Trans
(liftIO
)
5 import Readline
(addHistory
, readline
, load_history
)
7 import Reader
(read_str
)
8 import Printer
(_pr_str
)
12 mal_read
:: String -> IOThrows MalVal
17 eval
:: MalVal
-> MalVal
22 mal_print
:: MalVal
-> IOThrows
String
23 mal_print
= liftIO
. Printer
._pr_str
True
27 rep
:: String -> IOThrows
String
28 rep line
= mal_print
=<< (eval
<$> mal_read line
)
32 line
<- readline
"user> "
38 res
<- runExceptT
$ rep str
40 Left mv
-> (++) "Error: " <$> liftIO
(Printer
._pr_str
True mv
)
41 Right val
-> return val