Commit | Line | Data |
---|---|---|
b76aa73b JM |
1 | import Control.Monad (when) |
2 | import Control.Monad.Error (throwError) | |
3 | ||
fa9a9758 | 4 | import Readline (readline, load_history) |
b76aa73b JM |
5 | import Types |
6 | import Reader (read_str) | |
7 | import Printer (_pr_str) | |
8 | ||
9 | -- read | |
10 | mal_read :: String -> IO MalVal | |
11 | mal_read str = read_str str | |
12 | ||
13 | -- eval | |
14 | eval :: MalVal -> String -> MalVal | |
15 | eval ast env = ast | |
16 | ||
17 | ||
18 | mal_print :: MalVal -> String | |
19 | mal_print exp = show exp | |
20 | ||
21 | -- repl | |
22 | rep :: String -> IO String | |
23 | rep line = do | |
24 | ast <- mal_read line | |
25 | return $ mal_print (eval ast "") | |
26 | ||
27 | repl_loop :: IO () | |
28 | repl_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 |
39 | main = do |
40 | load_history | |
41 | repl_loop |