tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

commit 5346e9d31a19c85ff0883268307a166441f4804b
parent 967892d64272badd188e1fea69f8240ec3cd3070
Author: James Eversole <james@eversole.co>
Date:   Mon, 27 Jan 2025 16:19:59 -0600

Gracefully ignore no-op redefs

Diffstat:
Msrc/Eval.hs | 32++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/src/Eval.hs b/src/Eval.hs @@ -10,26 +10,26 @@ import qualified Data.Set as Set evalSingle :: Env -> TricuAST -> Env evalSingle env term - | SDef name [] body <- term = - if - | Map.member name env -> - errorWithoutStackTrace $ - "Error: Identifier '" ++ name ++ "' is already defined." - | otherwise -> - let res = evalAST env body - in Map.insert "!result" res (Map.insert name res env) - | SApp func arg <- term = - let res = apply (evalAST env func) (evalAST env arg) + | SDef name [] body <- term + = case Map.lookup name env of + Just existingValue + | existingValue == evalAST env body -> env + | otherwise -> errorWithoutStackTrace $ + "Unable to rebind immutable identifier: '" ++ name + Nothing -> + let res = evalAST env body + in Map.insert "!result" res (Map.insert name res env) + | SApp func arg <- term + = let res = apply (evalAST env func) (evalAST env arg) in Map.insert "!result" res env - | SVar name <- term = - case Map.lookup name env of - Just v -> - Map.insert "!result" v env + | SVar name <- term + = case Map.lookup name env of + Just v -> Map.insert "!result" v env Nothing -> errorWithoutStackTrace $ "Variable `" ++ name ++ "` not defined\n\ \This error should never occur here. Please report this as an issue." - | otherwise = - Map.insert "!result" (evalAST env term) env + | otherwise + = Map.insert "!result" (evalAST env term) env evalTricu :: Env -> [TricuAST] -> Env evalTricu env x = go env (reorderDefs env x)