on ea05fbe help sign in
elk/src/FreeVar.hs
30 lines 1.0 kB history raw
1module FreeVar (freeIn) where
3import Ast
4import Data.Set (union, unions, delete, singleton, empty, difference, member)
6x `freeIn` expr = member x $ freeVars expr
8freeVars expr =
9 let f = freeVars in
10 case expr of
11 Range e1 e2 -> f e1 `union` f e2
12 Binop op e1 e2 -> f e1 `union` f e2
13 Lambda x e -> delete x (f e)
14 App e1 e2 -> f e1 `union` f e2
15 If e1 e2 e3 -> unions $ map f [e1,e2,e3]
16 Lift e es -> unions $ map f es
17 Fold e1 e2 e3 -> unions $ map f [e1,e2,e3]
18 Async e -> f e
19 Let defs e -> foldr delete (unions (f e : map f es)) vs
20 where (vs,es) = unzip defs
21 Var x -> singleton x
22 Data name es -> unions (map f es)
23 Case e cases -> f e `union` unions (map caseFreeVars cases)
24 _ -> empty
26caseFreeVars (p,e) = difference (freeVars e) (pvars p)
27 where pvars p = case p of
28 PAnything -> empty
29 PVar x -> singleton x
30 PData _ ps -> unions (map pvars ps)