# File eval mode now relies on main function

To encourage organizing code in a way that helps in understanding, I
have implemented the common idiom of requiring a `main` function. In
tricu and other functional languages, it is usually placed near the top
of the module. The evaluator gracefully handles the situation of passing
multiple files where the intermediary "library" files do not have main functions.
This commit is contained in:
2025-01-26 15:33:12 -06:00
committed by James Eversole
parent 425489a73f
commit c9d0d04630
16 changed files with 39 additions and 58 deletions

View File

@@ -1,6 +1,6 @@
module Main where
import Eval (evalTricu, result)
import Eval (evalTricu, mainResult, result)
import FileEval
import Parser (parseTricu)
import REPL
@@ -16,7 +16,7 @@ import qualified Data.Map as Map
data TricuArgs
= Repl
| Evaluate { file :: [FilePath], form :: EvaluatedForm }
| Decode { file :: [FilePath] }
| TDecode { file :: [FilePath] }
deriving (Show, Data, Typeable)
replMode :: TricuArgs
@@ -31,7 +31,7 @@ evaluateMode = Evaluate
\ Defaults to stdin."
&= name "f" &= typ "FILE"
, form = TreeCalculus &= typ "FORM"
&= help "Optional output form: (tree|fsl|ast|ternary|ascii).\n \
&= help "Optional output form: (tree|fsl|ast|ternary|ascii|decode).\n \
\ Defaults to tricu-compatible `t` tree form."
&= name "t"
}
@@ -40,7 +40,7 @@ evaluateMode = Evaluate
&= name "eval"
decodeMode :: TricuArgs
decodeMode = Decode
decodeMode = TDecode
{ file = def
&= help "Optional input file path to attempt decoding.\n \
\ Defaults to stdin."
@@ -70,10 +70,10 @@ main = do
(filePath:restFilePaths) -> do
initialEnv <- evaluateFile filePath
finalEnv <- foldM evaluateFileWithContext initialEnv restFilePaths
pure $ result finalEnv
pure $ mainResult finalEnv
let fRes = formatResult form result
putStr fRes
Decode { file = filePaths } -> do
TDecode { file = filePaths } -> do
value <- case filePaths of
[] -> getContents
(filePath:_) -> readFile filePath