tricu/src/REPL.hs

55 lines
1.5 KiB
Haskell
Raw Normal View History

module REPL where
import Eval
import Lexer
import Parser
import Research
2024-12-29 20:29:41 -06:00
import Control.Exception (SomeException, catch)
import Control.Monad.IO.Class (liftIO)
import Data.List (intercalate)
import System.Console.Haskeline
2024-12-29 20:29:41 -06:00
import qualified Data.Map as Map
repl :: Env -> IO ()
repl env = runInputT defaultSettings (loop env)
where
loop :: Env -> InputT IO ()
loop env = do
2024-12-29 08:29:25 -06:00
minput <- getInputLine "tricu < "
case minput of
Nothing -> outputStrLn "Goodbye!"
Just ":_exit" -> outputStrLn "Goodbye!"
Just "" -> do
outputStrLn ""
loop env
Just input -> do
2024-12-29 20:29:41 -06:00
newEnv <- liftIO $ (processInput env input `catch` errorHandler env)
loop newEnv
processInput :: Env -> String -> IO Env
2024-12-29 20:29:41 -06:00
processInput env input = do
let asts = parseTricu input
newEnv = evalTricu env asts
2024-12-29 20:29:41 -06:00
case Map.lookup "__result" newEnv of
Just r -> do
putStrLn $ "tricu > " ++ show r
putStrLn $ "READ -: \"" ++ decodeResult r ++ "\""
Nothing -> return ()
return newEnv
errorHandler :: Env -> SomeException -> IO (Env)
2024-12-29 20:29:41 -06:00
errorHandler env e = do
putStrLn $ "Error: " ++ show e
return env
decodeResult :: T -> String
2024-12-28 07:24:19 -06:00
decodeResult tc = case toNumber tc of
Right num -> show num
2024-12-28 07:24:19 -06:00
Left _ -> case toString tc of
Right str -> str
2024-12-28 07:24:19 -06:00
Left _ -> case toList tc of
Right list -> "[" ++ intercalate ", " (map decodeResult list) ++ "]"
Left _ -> ""