Haskell: steps 4-6. Line editing. Simpler fn calls.
[jackhill/mal.git] / haskell / step1_read_print.hs
CommitLineData
b76aa73b
JM
1import Control.Monad (when)
2import Control.Monad.Error (throwError)
3
fa9a9758 4import Readline (readline, load_history)
b76aa73b
JM
5import Types
6import Reader (read_str)
7import Printer (_pr_str)
8
9-- read
10mal_read :: String -> IO MalVal
11mal_read str = read_str str
12
13-- eval
14eval :: MalVal -> String -> MalVal
15eval ast env = ast
16
17-- print
18mal_print :: MalVal -> String
19mal_print exp = show exp
20
21-- repl
22rep :: String -> IO String
23rep line = do
24 ast <- mal_read line
25 return $ mal_print (eval ast "")
26
27repl_loop :: IO ()
28repl_loop = do
fa9a9758
JM
29 line <- readline "user> "
30 case line of
31 Nothing -> return ()
32 Just "" -> repl_loop
33 Just str -> do
34 out <- catchAny (rep str) $ \e -> do
35 return $ "Error: " ++ (show e)
36 putStrLn out
37 repl_loop
b76aa73b 38
fa9a9758
JM
39main = do
40 load_history
41 repl_loop