2024-12-20 11:38:09 -06:00
|
|
|
module REPL where
|
|
|
|
|
|
|
|
import Eval
|
|
|
|
import Lexer
|
|
|
|
import Parser
|
|
|
|
import Research
|
|
|
|
|
2024-12-27 20:54:30 -06:00
|
|
|
import Data.List (intercalate)
|
2024-12-20 11:38:09 -06:00
|
|
|
import qualified Data.Map as Map
|
2024-12-27 20:46:30 -06:00
|
|
|
import System.Console.Haskeline
|
2024-12-28 07:15:25 -06:00
|
|
|
import System.IO (hFlush, stdout)
|
2024-12-20 11:38:09 -06:00
|
|
|
|
|
|
|
repl :: Map.Map String T -> IO ()
|
2024-12-27 20:46:30 -06:00
|
|
|
repl env = runInputT defaultSettings (loop env)
|
|
|
|
where
|
|
|
|
loop :: Map.Map String T -> InputT IO ()
|
|
|
|
loop env = do
|
2024-12-29 08:29:25 -06:00
|
|
|
minput <- getInputLine "tricu < "
|
2024-12-27 20:46:30 -06:00
|
|
|
case minput of
|
|
|
|
Nothing -> outputStrLn "Goodbye!"
|
|
|
|
Just ":_exit" -> outputStrLn "Goodbye!"
|
|
|
|
Just "" -> do
|
|
|
|
outputStrLn ""
|
|
|
|
loop env
|
|
|
|
Just input -> do
|
|
|
|
let clearEnv = Map.delete "__result" env
|
|
|
|
newEnv = evalSingle clearEnv (parseSingle input)
|
|
|
|
case Map.lookup "__result" newEnv of
|
|
|
|
Just r -> do
|
2024-12-29 08:29:25 -06:00
|
|
|
outputStrLn $ "tricu > " ++ show r
|
2024-12-27 20:46:30 -06:00
|
|
|
outputStrLn $ "DECODE -: " ++ decodeResult r
|
|
|
|
Nothing -> return ()
|
|
|
|
loop newEnv
|
2024-12-27 15:40:50 -06:00
|
|
|
|
|
|
|
decodeResult :: T -> String
|
2024-12-28 07:24:19 -06:00
|
|
|
decodeResult tc = case toNumber tc of
|
2024-12-27 20:46:30 -06:00
|
|
|
Right num -> show num
|
2024-12-28 07:24:19 -06:00
|
|
|
Left _ -> case toString tc of
|
2024-12-27 15:40:50 -06:00
|
|
|
Right str -> "\"" ++ str ++ "\""
|
2024-12-28 07:24:19 -06:00
|
|
|
Left _ -> case toList tc of
|
2024-12-27 20:54:30 -06:00
|
|
|
Right list -> "[" ++ intercalate ", " (map decodeResult list) ++ "]"
|
2024-12-27 19:27:04 -06:00
|
|
|
Left _ -> ""
|