blob: 86f1d2213c18b1951d3135bfdc7638b7c466aa6e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
{-# LANGUAGE LambdaCase #-}
module Lib (
runScriptFile,
runInlineScript,
) where
import qualified Data.List as L
import Control.Monad.Except
import Control.Monad.Reader
import Utils
import Tokenizer ( tokenize )
import Parser ( parse )
import Evaluator ( evaluate )
runScriptFile :: Env -> String -> LContext Env
runScriptFile env fileName = do
src <- liftIO $ readFile fileName
runInlineScript env src
runInlineScript :: Env -> String -> LContext Env
runInlineScript env src = do
tokenized <- tokenize src
config <- ask
when (configVerboseMode config) $ liftIO $ putStrLn $ "tokenized:\t\t" ++ show tokenized
parsed <- parse tokenized
when (configVerboseMode config) $ do
let output = "parsed:\t\t\t" ++ (map show parsed $> L.intercalate "\n\t\t\t")
liftIO $ putStrLn output
(newEnv, evaluated) <- foldEvaluate env parsed
liftIO $ mapM_ putStrLn (map show evaluated)
return newEnv
where
foldEvaluate :: Env -> [AST] -> LContext (Env, [AST])
foldEvaluate accEnv [] = return (accEnv, [])
foldEvaluate accEnv (ast:rest) = do
(newAccEnv, newAst) <- evaluate accEnv ast
(retEnv, restEvaled) <- foldEvaluate newAccEnv rest
return $ (retEnv, newAst : restEvaled)
|