blob: a8a536f6769bbaa9d2b936118e4824ea22be1103 (
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
39
40
41
42
43
|
{-# 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, [AST])
runScriptFile env fileName = do
src <- liftIO $ readFile fileName
runInlineScript fileName env src
runInlineScript :: String -> Env -> String -> LContext (Env, [AST])
runInlineScript fileName env src = do
tokenized <- tokenize fileName 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
when (configPrintEvaled config) $ do
liftIO $ mapM_ putStrLn (map show evaluated)
return (newEnv, evaluated)
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)
|