Use reserved bang sym for env result

This commit is contained in:
James Eversole 2025-01-27 08:46:40 -06:00
parent f71f88dce3
commit 79317bf4e3
6 changed files with 15 additions and 15 deletions

View File

@ -17,19 +17,19 @@ evalSingle env term
"Error: Identifier '" ++ name ++ "' is already defined." "Error: Identifier '" ++ name ++ "' is already defined."
| otherwise -> | otherwise ->
let res = evalAST env body let res = evalAST env body
in Map.insert "__result" res (Map.insert name res env) in Map.insert "!result" res (Map.insert name res env)
| SApp func arg <- term = | SApp func arg <- term =
let res = apply (evalAST env func) (evalAST env arg) let res = apply (evalAST env func) (evalAST env arg)
in Map.insert "__result" res env in Map.insert "!result" res env
| SVar name <- term = | SVar name <- term =
case Map.lookup name env of case Map.lookup name env of
Just v -> Just v ->
Map.insert "__result" v env Map.insert "!result" v env
Nothing -> Nothing ->
errorWithoutStackTrace $ "Variable `" ++ name ++ "` not defined\n\ errorWithoutStackTrace $ "Variable `" ++ name ++ "` not defined\n\
\This error should never occur here. Please report this as an issue." \This error should never occur here. Please report this as an issue."
| otherwise = | otherwise =
Map.insert "__result" (evalAST env term) env Map.insert "!result" (evalAST env term) env
evalTricu :: Env -> [TricuAST] -> Env evalTricu :: Env -> [TricuAST] -> Env
evalTricu env x = go env (reorderDefs env x) evalTricu env x = go env (reorderDefs env x)
@ -37,7 +37,7 @@ evalTricu env x = go env (reorderDefs env x)
go env [] = env go env [] = env
go env [x] = go env [x] =
let updatedEnv = evalSingle env x let updatedEnv = evalSingle env x
in Map.insert "__result" (result updatedEnv) updatedEnv in Map.insert "!result" (result updatedEnv) updatedEnv
go env (x:xs) = go env (x:xs) =
evalTricu (evalSingle env x) xs evalTricu (evalSingle env x) xs
@ -180,9 +180,9 @@ depends topDefs (SDef _ _ body) =
depends _ _ = Set.empty depends _ _ = Set.empty
result :: Env -> T result :: Env -> T
result r = case Map.lookup "__result" r of result r = case Map.lookup "!result" r of
Just a -> a Just a -> a
Nothing -> errorWithoutStackTrace "No __result field found in provided env" Nothing -> errorWithoutStackTrace "No !result field found in provided env"
mainResult :: Env -> T mainResult :: Env -> T
mainResult r = case Map.lookup "main" r of mainResult r = case Map.lookup "main" r of

View File

@ -23,8 +23,8 @@ identifier = do
<|> char '_' <|> char '-' <|> char '?' <|> char '!' <|> char '_' <|> char '-' <|> char '?' <|> char '!'
<|> char '$' <|> char '#' <|> char '@' <|> char '%' <|> char '$' <|> char '#' <|> char '@' <|> char '%'
let name = first : rest let name = first : rest
if (name == "t" || name == "__result") if (name == "t" || name == "!result")
then fail "Keywords (`t`, `__result`) cannot be used as an identifier" then fail "Keywords (`t`, `!result`) cannot be used as an identifier"
else return (LIdentifier name) else return (LIdentifier name)
integerLiteral :: Lexer LToken integerLiteral :: Lexer LToken

View File

@ -61,7 +61,7 @@ main = do
putStrLn "Welcome to the tricu REPL" putStrLn "Welcome to the tricu REPL"
putStrLn "You can exit with `CTRL+D` or the `:_exit` command.`" putStrLn "You can exit with `CTRL+D` or the `:_exit` command.`"
library <- liftIO $ evaluateFile "./lib/base.tri" library <- liftIO $ evaluateFile "./lib/base.tri"
repl $ Map.delete "__result" library repl $ Map.delete "!result" library
Evaluate { file = filePaths, form = form } -> do Evaluate { file = filePaths, form = form } -> do
result <- case filePaths of result <- case filePaths of
[] -> do [] -> do

View File

@ -244,7 +244,7 @@ parseVarM :: ParserM TricuAST
parseVarM = do parseVarM = do
satisfyM (\case LIdentifier _ -> True; _ -> False) >>= \case satisfyM (\case LIdentifier _ -> True; _ -> False) >>= \case
LIdentifier name LIdentifier name
| name == "t" || name == "__result" -> | name == "t" || name == "!result" ->
fail ("Reserved keyword: " ++ name ++ " cannot be assigned.") fail ("Reserved keyword: " ++ name ++ " cannot be assigned.")
| otherwise -> | otherwise ->
pure (SVar name) pure (SVar name)

View File

@ -34,7 +34,7 @@ repl env = runInputT defaultSettings (loop env)
loop env loop env
| Just p <- path -> do | Just p <- path -> do
loadedEnv <- liftIO $ evaluateFileWithContext env (strip p) `catch` \e -> errorHandler env e loadedEnv <- liftIO $ evaluateFileWithContext env (strip p) `catch` \e -> errorHandler env e
loop $ Map.delete "__result" (Map.union loadedEnv env) loop $ Map.delete "!result" (Map.union loadedEnv env)
| Just s <- minput -> do | Just s <- minput -> do
if if
| take 2 s == "--" -> loop env | take 2 s == "--" -> loop env
@ -47,7 +47,7 @@ repl env = runInputT defaultSettings (loop env)
let asts = parseTricu input let asts = parseTricu input
newEnv = evalTricu env asts newEnv = evalTricu env asts
if if
| Just r <- Map.lookup "__result" newEnv -> do | Just r <- Map.lookup "!result" newEnv -> do
putStrLn $ "tricu > " ++ decodeResult r putStrLn $ "tricu > " ++ decodeResult r
| otherwise -> return () | otherwise -> return ()
return newEnv return newEnv

View File

@ -70,9 +70,9 @@ lexer = testGroup "Lexer Tests"
Right i -> i @?= expect Right i -> i @?= expect
, testCase "Error when using invalid characters in identifiers" $ do , testCase "Error when using invalid characters in identifiers" $ do
case (runParser tricuLexer "" "__result = 5") of case (runParser tricuLexer "" "!result = 5") of
Left _ -> return () Left _ -> return ()
Right _ -> assertFailure "Expected failure when trying to assign the value of __result" Right _ -> assertFailure "Expected failure when trying to assign the value of !result"
] ]
parser :: TestTree parser :: TestTree