@@ -1,3 +1,4 @@
1+{-# OPTIONS_GHC -Wall #-}
1module Transform.Substitute (subst) where
2module Transform.Substitute (subst) where
3import SourceSyntax.Expression
4import SourceSyntax.Expression
@@ -9,20 +10,22 @@ subst old new expr =
9 let f (L t s e) = L t s (subst old new e) in
10 let f (L t s e) = L t s (subst old new e) in
10 case expr of
11 case expr of
11 Range e1 e2 -> Range (f e1) (f e2)
12 Range e1 e2 -> Range (f e1) (f e2)
12− Access e x -> Access (f e) x
13+ ExplicitList es -> ExplicitList (map f es)
13− Remove e x -> Remove (f e) x
14− Insert e x v -> Insert (f e) x (f v)
15− Modify r fs -> Modify (f r) (map (second f) fs)
16− Record fs -> Record (map (\(lbl,as,e) -> (lbl,as,f e)) fs)
17 Binop op e1 e2 -> Binop op (f e1) (f e2)
14 Binop op e1 e2 -> Binop op (f e1) (f e2)
18 Lambda x e -> if x == old then expr else Lambda x (f e)
15 Lambda x e -> if x == old then expr else Lambda x (f e)
19 App e1 e2 -> App (f e1) (f e2)
16 App e1 e2 -> App (f e1) (f e2)
20 MultiIf ps -> MultiIf (map (f *** f) ps)
17 MultiIf ps -> MultiIf (map (f *** f) ps)
21− Let defs e -> Let (map substDef defs) (f e)
18+ Let defs body -> Let (map substDef defs) (f body)
22 where substDef (FnDef name vs e) = FnDef name vs (f e)
19 where substDef (FnDef name vs e) = FnDef name vs (f e)
23 substDef (OpDef op a1 a2 e) = OpDef op a1 a2 (f e)
20 substDef (OpDef op a1 a2 e) = OpDef op a1 a2 (f e)
24 substDef x = x
21 substDef x = x
25 Var x -> if x == old then new else expr
22 Var x -> if x == old then new else expr
26 Case e cases -> Case (f e) $ map (second f) cases
23 Case e cases -> Case (f e) $ map (second f) cases
27 Data name es -> Data name (map f es)
24 Data name es -> Data name (map f es)
25+ Access e x -> Access (f e) x
26+ Remove e x -> Remove (f e) x
27+ Insert e x v -> Insert (f e) x (f v)
28+ Modify r fs -> Modify (f r) (map (second f) fs)
29+ Record fs -> Record (map (\(lbl,as,e) -> (lbl,as,f e)) fs)
28− _ -> expr
31+ Markdown _ -> expr