diff options
author | tomsmeding <tom.smeding@gmail.com> | 2019-12-14 23:01:36 +0100 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2019-12-14 23:23:11 +0100 |
commit | 8601d4637314b1bc9ae0d5e5e5aa9d32e740935d (patch) | |
tree | 6e7de0c9e2170fc81c18b1f0fd3bd9c604139b79 /AST.hs | |
parent | 638181c4f19f38898abf5ff41b891eaa62ea9325 (diff) |
Some small-function inlininginlining
Diffstat (limited to 'AST.hs')
-rw-r--r-- | AST.hs | 22 |
1 files changed, 22 insertions, 0 deletions
@@ -1,5 +1,8 @@ module AST where +import qualified Data.Map.Strict as Map +import Data.Maybe + import Data.List @@ -52,3 +55,22 @@ fromVNum _ = Nothing fromVString :: Value -> Maybe String fromVString (VString s) = Just s fromVString _ = Nothing + +replaceNames :: Map.Map Name Value -> Value -> Value +replaceNames mp origValue = + case origValue of + VList vs -> VList (map (replaceNames mp) vs) + VName n -> fromMaybe origValue (Map.lookup n mp) + VDefine n v -> VDefine n (replaceNames mp v) + VLambda as v -> VLambda as (replaceNames (foldr Map.delete mp as) v) + VLambdaRec rn as v -> VLambdaRec rn as (replaceNames (foldr Map.delete mp (rn : as)) v) + VLet [] v -> VLet [] (replaceNames mp v) + VLet ((n, d) : pairs) v -> + let VLet pairs' v' = replaceNames (Map.delete n mp) (VLet pairs v) + in VLet ((n, replaceNames mp d) : pairs') v' + VNum _ -> origValue + VString _ -> origValue + VQuoted _ -> origValue + VDeclare _ -> origValue + VBuiltin _ -> origValue + VEllipsis -> origValue |